2013-05-27 23 views
5

Tôi đang cố gắng nhúng thư viện Python (2.7) vào ứng dụng C của mình và tôi đang sử dụng API Python/C để gọi mã Python từ C. Tôi cần gọi phương thức Python có từ khóa lập luận. Ngữ nghĩa, tôi đang cố gắng để đạt được tương đương với dòng sau bằng Python:PyObject_CallMethod với đối số từ khóa

myobject.dosomething('blahdy blah', somearg=True) 

Bằng cách đọc documentation, tôi đã cố gắng để có được như xa như sau, nhưng điều này không vượt qua trong các đối số từ khóa :

PyObject_CallMethod(myobject, "dosomething", "s", "blahdy blah"); 

Tôi không quá quen thuộc với Python và tôi bị kẹt ở điểm này vì tài liệu không hoàn toàn rõ ràng về điều này và tìm kiếm trên Google cũng không đưa ra nhiều thông tin hữu ích. Tôi đánh giá cao sự giúp đỡ nào.

+2

Dường như không có chức năng gọi phương thức có đối số từ khóa. Ít nhất, hãy xem [this] (http://mail.python.org/pipermail/python-dev/2007-June/073661.html). Tuy nhiên, 'PyObject_Call' luôn hoạt động. – Bakuriu

+0

@ Bakuriu: cảm ơn vì gợi ý! Cuối cùng, đó chính xác là những gì tôi đã làm. –

Trả lời

6

Cuối cùng tôi đã sử dụng PyObject_Call để làm điều này (cảm ơn Bakuriu cho gợi ý!). Chỉ trong trường hợp bất cứ ai thắc mắc làm thế nào để làm điều đó, đây là mã của tôi:

PyObject *args = Py_BuildValue("(s)", "blahdy blah");  
PyObject *keywords = PyDict_New(); 
PyDict_SetItemString(keywords, "somearg", Py_True); 

PyObject_Call(PyObject_GetAttrString(myobject, "do something"), args, keywords); 
Py_DECREF(args); 
Py_DECREF(keywords); 
5

Câu trả lời của Tamas sẽ hoàn thành công việc, nhưng nó cũng sẽ rò rỉ bộ nhớ. Để tránh rò rỉ, hãy sử dụng

PyObject *args = Py_BuildValue("(s)", "blahdy blah");  
PyObject *keywords = PyDict_New(); 
PyDict_SetItemString(keywords, "somearg", Py_True); 
PyObject *myobject_method = PyObject_GetAttrString(myobject, "do something"); 

PyObject *result = PyObject_Call(myobject_method, args, keywords); 
Py_DECREF(args); 
Py_DECREF(keywords); 
Py_DECREF(myobject_method); 

// Do something with the result 

Py_DECREF(result); 

Tất nhiên, nếu có bất kỳ lỗi hoặc ngoại lệ nào trong mã Python một số PyObject sẽ là NULL và chương trình của bạn có thể gặp sự cố. Kiểm tra kết quả NULL và/hoặc sử dụng Py_DECREFX() có thể giúp bạn tránh điều này.

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