#python #c #python-2.7
#python #c #python-2.7
Вопрос:
Я только начал работать с Python с C , и я немного смущен тем, почему я не могу вызывать функции в Python из C .
Вот мой текущий тестовый код на C :
#include <iostream>
#include <Python.h>
using namespace std;
int main()
{
Py_Initialize();
PyObject* myModuleString = PyString_FromString("test");
PyObject* myModule = PyImport_Import(myModuleString);
if( myModule )
{
PyObject* myFunction = PyObject_GetAttrString(myModule, "Hello");
if( myFunction )
{
PyEval_CallObject( myFunction, NULL );
}
else
{
fprintf( stderr, "myFunction is NULL" );
}
}
else
{
fprintf( stderr, "myModule is NULL" );
}
Py_Finalize();
cin.get();
return 0;
}
Вот мой test.py Код на Python:
import sys
def Hello():
print "Hello, world!"
Раньше у меня был более сложный тест, но я столкнулся с проблемой, когда PyObject_GetAttrString передавал обратно NULL, поэтому я хотел сделать более простой тест, и я все равно получил NULL после вызова PyObject_GetAttrString . Насколько я понимаю, PyObject_GetAttrString возвращает вам PyObject * в функцию, а затем я вызываю ее после, поэтому получение NULL там в основном означает, что я не могу вызвать функцию.
Также да, я посмотрел на https://docs.python.org/2.7 / и даже протестировал пример, приведенный на шаге 5.3 https://docs.python.org/release/2.6.5/extending/embedding.html#pure-embedding (Я использую 2.7.7, потому что планирую интегрироваться с 3ds Max). Он по-прежнему сталкивается с теми же проблемами с PyObject_GetAttrString .
Я предполагаю, что это простая ошибка или шаг, который я пропускаю в коде C или Python.
Ответ №1:
Изменение имени скрипта Python с test.py
на что-либо другое сработало для меня.
Ответ №2:
У меня была похожая проблема. Я обнаружил, что пробел в строке, которую я передавал в python, был неправильным. Насколько я могу судить, в вашем операторе print вместо 4 пробелов 6. Создайте резервную копию и посмотрите, не все ли прояснилось.
Ответ №3:
У меня была та же проблема. Хотя test.py
и mycode.c
находились в той же папке (/home/ user/python/example), мне пришлось добавить ссылку на путь после Py_Initialize();
, как показано в следующей строке
PyRun_SimpleString ("import sys; sys.path.insert(0, '/home/user/python/spp')");*
Заменить /home … к вашему пути.
В моем предыдущем коде не было этой строки кода, но PyImport_Import
он работал и PyObject_GetAttrString
не работал. Для меня нет смысла: «Не спрашивай меня, я не знаю — Оззи».