我正在尝试导入与 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")
.
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句