2011-09-24 41 views
5

Tôi mới sử dụng tính năng nhúng python. Tôi đang cố gắng nhúng mã python + numpy bên trong hàm gọi lại C++ (bên trong một dll)Nhúng mã python + numpy vào C++ dll callback

vấn đề mà tôi đang gặp phải là như sau. nếu tôi có:

Py_Initialize(); 
// some python glue 
// python invocation 
Py_Finalize(); 

mọi thứ đều hoạt động tốt.

nhưng nếu tôi có:

Py_Initialize(); 
_import_array(); //to initialize numpy C-API 
// some python glue + numpy array object creation 
// python invocation via PyObject_CallObject() 
Py_Finalize(); 

này treo ở lần thứ hai nó đạt _import_array(); (có nghĩa là nó hoạt động cho lần gọi lại đầu tiên)

nếu tôi thay thế khởi tạo chỉ một lần và kết thúc trong trình phá hủy (do đó không phải lúc khởi tạo/hoàn tất), mọi sự cố khi rời khỏi cuộc gọi lại.

vấn đề ở đây tôi đoán là numPy, nhưng tôi không biết làm thế nào để giải quyết nó

+0

Nếu bạn hoàn toàn có thể kiểm soát cách các DLL được xây dựng, tôi sẽ peronally rời các chi tiết để distutils và uống một lân. Đây là một dự án ví dụ (giao tiếp với numpy): https://github.com/martinxyz/python/tree/master/realistic – maxy

Trả lời

1

cố gắng đảm bảo .dll của bạn chỉ được khởi tạo lần, bất kể bao nhiêu lần mã được thực sự gọi.

Dưới đây là một liên kết trên "C++ Singleton trong một DLL":

Singleton in a DLL?

+0

Xin chào Paul, cảm ơn câu trả lời của bạn! Vì vậy, tôi khá chắc chắn dll của tôi được khởi tạo chỉ một lần, và trong thực tế, tôi bỏ qua để nói rằng nếu tôi cũng khởi tạo python lúc khởi tạo dll của tôi, và hoàn thành trong destructor, một cái gì đó như thế này hoạt động tốt: ' PyRun_SimpleString (' ' "từ thời gian nhập thời gian, ctime \ n" ' ' "từ nhập gọn gàng * \ n" ' ' "in 'Hôm nay là', ctime (time()) \ n" '\t ') ; ' nhưng nếu tôi cố gắng gọi python qua PyObject_CallObject(), thì nó không hoạt động nữa, và nó đổ vỡ khi gọi lại kết thúc –

+1

Hi - 1) Đảm bảo bạn khởi tạo chỉ có ADCE trong khi thực hiện chương trình (và không khởi tạo Nhiều hơn một lần, nếu không thì không bao giờ). 2) Nhìn vào mã mẫu martinxyz được đăng ở trên, 3) Xem chủ đề này - một vấn đề tương tự, do lỗi số tham chiếu gây ra: http://www.velocityreviews.com/forums/t566237-pyobject_callobject-code-dump-after -calling-4-times.html – paulsm4

+0

Cảm ơn rất nhiều Paul, liên kết này đã giúp rất nhiều! trong thực tế, vấn đề là DECREF của một đối tượng được sử dụng bởi PyTuple_SetItem(). Bây giờ nó có vẻ hoạt động, nhưng tôi phải làm một số bài kiểm tra rộng rãi hơn, tất nhiên! Cảm ơn bạn một lần nữa! –