2011-06-20 22 views
13

Tôi đang truy cập một cấu trúc C có chứa một số trường time_t sử dụng mô-đun python ctypes.Nhận loại/kích thước của `time_t` bằng cách sử dụng ctypes

Với tính chất hoàn toàn không di động, tôi không thể xác định các trường này tĩnh là loại c_int hoặc c_long.

Làm cách nào để xác định chúng để làm cho mã của tôi có thể di chuyển?

định nghĩa struct

Ví dụ C:

#import <sys/types.h> 
#import <time.h> 

typedef struct my_struct { 
    time_t timestap; 
    uint16_t code;  
}; 

Tương ứng ctypes python cấu trúc:

from ctypes import * 

c_time = ? # What do I have to put here? 

class MyStruct(Structure): 
    _fields_ = [ 
     ('timestamp', c_time), 
     ('code', c_int16), 
    ] 
+0

Câu hỏi tương tự cho CFFI: http://stackoverflow.com/questions/19352932/declare-struct-containing-time-t-field-in-python-cffi –

Trả lời

2

Tốt nhất là bởi introspecting hệ thống kịch bản của bạn chạy trên và thực hiện một cách tốt nhất mà không thể thiếu loại để sử dụng. Một cái gì đó như,

if sys.platform == 'win32': 
    time_t = ctypes.c_uint64 
# ... 

Dòng dưới cùng là time_t không được xác định trong tiêu chuẩn. Nó tùy thuộc vào hệ điều hành và trình biên dịch. Vì vậy, định nghĩa của bạn về time_t trong kịch bản Python của bạn phụ thuộc vào DLL/vì vậy bạn đang tương tác với.

+0

Vì vậy, về cơ bản, hai thư viện được chia sẻ được nạp vào cùng một tệp nhị phân có thể có kích thước khác nhau cho một loại time_t nếu chúng được biên dịch với các trình biên dịch khác nhau (nhưng tương thích)? – GaretJax

+0

Độ dài 'time_t' sẽ được xác định khi thư viện sử dụng nó đã được biên dịch thành nhị phân. Để làm cho nguồn của khách hàng tương thích, bạn chỉ cần sử dụng các thiết lập tương tự khi biên dịch sau này. – Santa

+0

Nó là không đủ, mặc dù như tôi đang sử dụng một mô-đun pyrex kết hợp với ctypes, tôi xác định một hằng số giữ kết quả của sizeof (time_t). Tôi không thể đảm bảo kích thước chính xác giữa các libs được biên dịch đã sử dụng, nhưng ít nhất là đối với các thiết lập trình biên dịch tôi hiện đang sử dụng (hy vọng rằng các thư viện được biên dịch với các thiết lập tương tự). – GaretJax

Các vấn đề liên quan