Функция PyObject_GetAttrString C , возвращающая NULL: невозможно вызвать функции Python из C

#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 не работал. Для меня нет смысла: «Не спрашивай меня, я не знаю — Оззи».