【问题标题】:PyImport_Import fails (returns NULL)PyImport_Import 失败(返回 NULL)
【发布时间】:2013-07-08 17:15:06
【问题描述】:

我是 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。你能帮我解决这个问题吗?任何帮助将不胜感激。

祝你好运,

亚历克斯

【问题讨论】:

  • 你忘记了用鸡血画五边形并点亮黑色蜡烛的步骤:P .... 这通常对我来说在混合 C 和 Python 时有用
  • 看起来 argv[0] 将是 exe 名称,argv[1] 将是 hello.pyargv[2] 将是 hello。你想导入别的东西而不是argv[1]吗?您需要模块名而不是源文件名吗?
  • 是的,没错。但我认为模块名称与文件名相同。对吗?
  • 模块名称为hello。标准的 python 脚本也是如此。你也不能从本地目录运行python -c "import hello.py"

标签: python c


【解决方案1】:

我已通过将 PYTHONPATH 设置为 pwd 解决了这个问题。还应为 argv[1] 设置模块名称(不带 .py)。

谢谢!

【讨论】:

  • 为我省去了很多麻烦!你自我回答这个问题真是太棒了。 +1
  • 这对我也有用!考虑到 py.exe 和 python.exe 需要脚本的全名,这令人难以置信且完全不直观。谢谢!!
  • 谢谢!哇——整个晚上都在这上面度过。谢谢谢谢谢谢。
  • 非常感谢。但是为什么我们需要将 PYTHONPATH 设置为 pwd???
【解决方案2】:

我在挣扎了一段时间后也遇到了这个问题。在搜索网络后,我发现这是一个系统路径问题。在 Py_Initialize(); 之后添加两行之后成功了。

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

参考:C++ With Python

Py_Initialize();
PyRun_SimpleString("import sys");
PyRun_SimpleString("sys.path.append(\"C:\\Python27\")");

【讨论】:

  • 我遇到了同样的问题,并添加了您推荐的 2 行,将 path.append 更改为我的 python 库和 DLL 存在的“c:\python35”,但这对我没有帮助。 PyImport_Import() 总是返回 NULL。
  • 无论有没有您的建议,我都尝试了 Alexander 的解决方案,但似乎没有什么不同。但是,我保留它以防万一。 ;-)
  • 在 Linux 上也能很好地工作。
【解决方案3】:

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

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

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

【讨论】:

  • 你忘记了 PyRun_SimpleString("import os");
【解决方案4】:

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

PySys_SetArgv(argc, argv);

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

【讨论】:

    猜你喜欢
    • 2012-10-26
    • 2012-11-03
    • 2016-03-22
    • 2017-06-29
    • 2014-02-14
    • 1970-01-01
    • 2023-03-10
    • 2012-08-20
    • 2020-06-29
    相关资源
    最近更新 更多