15

我是python的新手,所以这可能是一个愚蠢的问题。我想用嵌入式 python 脚本编写简单的 c 程序。我有两个文件:

调用函数.c:

    #include <Python.h>
    int main(int argc, char *argv[])
    {
        PyObject *pName, *pModule, *pDict, *pFunc, *pValue;

        if (argc < 3)
        {
            printf("Usage: exe_name python_source function_name\n");
            return 1;
            }

        // Initialize the Python Interpreter
        Py_Initialize();

        // Build the name object
        if ((pName = PyString_FromString(argv[1])) == NULL) {
            printf("Error: PyString_FromString\n");
            return -1;
        }

        // Load the module object
        if ((pModule = PyImport_Import(pName)) == NULL) {
            printf("Error: PyImport_Import\n");
            return -1;
        }

        // pDict is a borrowed reference 
        if ((pDict = PyModule_GetDict(pModule))==NULL) {
            printf("Error: PyModule_GetDict\n");
            return -1;
        }
...

你好.py:

def hello():
    print ("Hello, World!")

我编译并运行它如下:

gcc -g -o call-function call-function.c -I/usr/include/python2.6 -lpython2.6
./call-function hello.py hello

并有这个:

Error: PyImport_Import

即 PyImport_Import 返回NULL。你能帮我解决这个问题吗?任何帮助将不胜感激。

最好的祝愿,

亚历克斯

4

4 回答 4

21

我已通过将 PYTHONPATH 设置为pwd. 还应为 argv[1] 设置模块名称(不带 .py)。

谢谢!

于 2013-07-09T08:37:54.007 回答
6

经过一段时间的努力,我也遇到了这个问题。搜索网络后,我发现这是一个系统路径问题。在 Py_Initialize(); 之后添加两行之后 有效。

操作系统:Windows 7,编译器:Embarcadero C++ Builder XE6,Python:2.7 版

参考:C++ 与 Python

Py_Initialize();
PyRun_SimpleString("import sys");
PyRun_SimpleString("sys.path.append(\"C:\\Python27\")");
于 2015-11-05T22:06:25.480 回答
3

如果 python 源文件位于工作目录中(即项目的 *.cpp 文件所在的位置),您可以使用...

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

...将工作目录添加到 Python 路径。

于 2018-12-28T19:18:52.497 回答
0

这是一个不起眼的案例,但我的 python 函数正在导入需要设置 argv 的代码。为了解决这个问题,我必须添加:

PySys_SetArgv(argc, argv);

在 Py_Initialize() 调用之后它开始工作。

于 2020-06-03T16:50:55.470 回答