2012-01-16 28 views
6

Tôi đang cố gắng truyền một con trỏ chuỗi ký tự kiểu chữ const char [] (trả về từ một DLL) thành một kiểu chuỗi tương thích với Python. nhưng khi Python27 thực hiện:đúc thành một chuỗi Python từ một char [] được trả về bởi một DLL

import ctypes 

charPtr = ctypes.cast("HiThere", ctypes.c_char_p) 
print("charPtr = ", charPtr) 

chúng tôi nhận được: charPtr = c_char_p('HiThere')

có lẽ một cái gì đó không phải là để được đánh giá đúng. Câu hỏi của tôi là:

  1. làm cách nào để truyền charPtr này trở lại chuỗi tương thích với Python, có thể in?
  2. là thao tác truyền được đề cập đến đang thực hiện những gì cần thực hiện?

Trả lời

9

ctypes.cast() được sử dụng để chuyển đổi một cá thể ctype sang kiểu dữ liệu ctype khác. Bạn không cần nó Để chuyển đổi nó thành chuỗi python. Chỉ cần sử dụng ".value" để lấy nó trong chuỗi python.

>>> s = "Hello, World" 
>>> c_s = c_char_p(s) 
>>> print c_s 
c_char_p('Hello, World') 
>>> print c_s.value 
Hello, World 

Thông tin thêm here

+0

vâng. Tôi đã chỉnh sửa một chút. Tôi đang cập nhật đúng cách. –

5

Nếu bạn đặt argtypes hoặc restype thuộc tính của ctypes chức năng, họ sẽ trả lại đối tượng Python ngay mà không cần một dàn diễn viên.

Dưới đây là một ví dụ gọi C-runtime timectime chức năng:

>>> from ctypes import * 
>>> m=CDLL('msvcrt') 
>>> t=c_long(0) 
>>> m.time(byref(t)) 
1326700130 
>>> m.ctime(byref(t)) # restype not set 
6952984 
>>> m.ctime.restype=c_char_p # set restype correctly 
>>> m.ctime(byref(t)) 
'Sun Jan 15 23:48:50 2012\n' 
+0

Liệu python có quản lý vòng đời của char được trả về không? –

+0

@ HelinWang không, không. Trong trường hợp này 'ctime' trả về một con trỏ tới bộ nhớ tĩnh để không có gì để quản lý. –

+0

Bạn có biết về trường hợp chung không? : thư viện c trả về một bộ nhớ được cấp phát trên heap. –

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