我正在尝试导入与main.c文件位于同一目录中的python文件,但是由于某种原因,它将无法正常工作。我一直在PyImport_ImportModule('dizzle')失败。我在Mac上提供的任何帮助将不胜感激(*我可以使它在Ubuntu上运行,这很奇怪)我设置了PYTHONPATH。

mytestfolder
   main.c
   dizzle.py


这是我的main.c

#include <stdio.h>
#include <string.h>
#include <assert.h>
#include <stdlib.h>
#include <Python/Python.h>

int main()
{
  char *xx = getpimacaddress2();
  printf("%s", xx);

}

char *getpimacaddress2()
{



    Py_Initialize();


    PyObject* module = PyImport_ImportModule("dizzle");
    assert(module != NULL);

    PyObject* klass = PyObject_GetAttrString(module, "SnowTest");
    assert(klass != NULL);

    PyObject* instance = PyInstance_New(klass, NULL, NULL);
    assert(instance != NULL);

    PyObject* result = PyObject_CallMethod(instance, "add_test", "(ii)", 10, 34);
    assert(result != NULL);

    Py_Finalize();

    return PyString_AsString(result);
}


Python文件dizzle.py

class SnowTest:

  def add_test(self, x, y):
    z = x + y
    return str(z)

最佳答案

我能够重现问题。但是请注意,我是在Windows上这样做的。解决方案应该相同。我在评论中提到sys.path可能与之有关。经过测试实际上是问题所在。

在调用Py_Initialize()之后,立即执行以下操作:

PyObject *sys = PyImport_ImportModule("sys");
PyObject *path = PyObject_GetAttrString(sys, "path");
PyList_Append(path, PyUnicode_FromString("..."));


在其中将...替换为可检索应用程序当前工作目录的内容(在您的情况下,其中将是包含dizzle.py文件的目录)。

您还可以检查:

PyRun_SimpleString("print(os.getcwd())");


如果它显示了应用程序的当前工作目录,则可以在调用Py_Initialize()之后立即执行以下操作:

PyRun_SimpleString("sys.path.append(os.getcwd())");


进行上述任何一项操作都会使assert(module != NULL)通过我。

如果确实与PYTHONPATH有关(我怀疑基于您的错误)。然后,您可以使用Py_SetPythonHome(L"/path/to/python")

关于python - 在C中使用python API在Mac上不起作用,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/42955022/

10-09 17:13