2015-06-15 19 views
5

Mam bibliotekę Rust, która musi zostać zaimportowana do Pythona za pośrednictwem modułu ctypes. Moim celem jest użycie funkcji Rust, które pobierają argumenty jako argumenty i zwracają te typy z Pythona. Obecnie mogę przekazywać liczby całkowite do funkcji Rust i mieć ich listy zwracane/liczby całkowite. Oto aktualny kod:Przekaż listę Pythona do funkcji Rust

Python:

import ctypes 
from ctypes import cdll 

class List_4(ctypes.Structure): 
    _fields_ = [("array", ctypes.ARRAY(ctypes.c_int32, 4))] 

rust = cdll.LoadLibrary("target/debug/py_link.dll") 
rust.function_vec.restype = List_4 

foobar = rust.function_i32(5) 
barbaz = rust.function_vec([1, 2, 3, 4]) # Throws error: Don't know how to convert parameter 

print foobar 
print barbaz 

Rust:

#[repr(C)] 
pub struct List_4 { 
    array: [i32; 4] 
} 

#[no_mangle] 
pub extern fn function_i32(number: i32) -> i32 { 
    number 
} 

#[no_mangle] 
pub extern fn function_vec(list: List_4) -> List_4 { 
    List_4 { array: [1, 2, 3, 5] } 
} 

Co muszę pomóc przechodzi listę Pythona jako argument do funkcji Rust. Domyślam się, że przekazuję ctypes.ARRAY do funkcji, a nie do listy, ale nie jestem pewien, jak przejść do konwersji listy Pythona na ten typ.

Uwaga: próbowałem kodu Rust z this related question, ale jest napisane "łączenie z` gcc` nie powiodło się: kod zakończenia: 1 "i" zły adres relok "podczas próby skompilowania go.

+0

Czy można wpadać na to pytanie? Nikt tego teraz nie zobaczy i wolałbym, aby ludzie odpowiedzieli na to pytanie, a nie na nowe. – pengowen123

+0

Tak, jestem w systemie Windows. Dzięki za poinformowanie mnie, mógłbym to zrobić, ale łatwiej byłoby użyć tablicy. Jednak nie byłoby zbyt trudno zrobić wektor z wydajnością, o której myślę, więc jeśli mogę przekazać tablicę do funkcji, może to zrobić konwersję. Popraw mnie, jeśli się mylę. – pengowen123

Odpowiedz

3

Wygląda na to, że rozwiązałem problem. Przekształciłem listę Pythona w tablicę C i przekazałem ją do funkcji Rust. Oto kod roboczych:

#[repr(C)] 
pub struct List_4 { 
    // Create a struct using #[repr(C)], will do the same in Python so it is shareable 
    array: [i32; 4] 
} 

#[no_mangle] 
pub extern fn function_array(list: List_4) -> List_4 { 
    // Return a new instance of List_4 
    List_4 { array: [1, 2, 3, 5] } 
} 

Python:

import ctypes # By using ctypes, and #[repr(C)], we use the same type 
       # of data in both languages, so it is possible to send stuff between them 

rust = cdll.LoadLibrary("target/debug/py_link.dll") # Import the Rust dll 

class List_4(ctypes.Structure): 
    # Similar to creating the struct in Rust 
    _fields_ = [("array", ctypes.ARRAY(ctypes.c_int32, 4))] 

rust.function_array.restype = List_4 # Set the function's return type to List_4 

def function_array(arr): 
    # For convenience, a function to convert a list to a C array, call the function, 
    # and convert its return value to a list 
    return list(
     rust.function_array(
      (ctypes.c_int * len(lst))(*lst) # Call the function after converting the list 
     ).array 
    ) 

# To use the function: 
>>> function_array([1, 2, 3]) 
[1, 2, 3, 5] 
Powiązane problemy