我正在尝试导入与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/