PyImport_Import失败(返回NULL)

时间:2013-07-08 17:15:06

标签: python c

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

呼叫function.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;
        }
...

hello.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 个答案:

答案 0 :(得分:13)

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

谢谢!

答案 1 :(得分:1)

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

OS: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 :(得分:0)

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

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

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

答案 3 :(得分:0)

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

pd.set_option('display.max_colwidth', None)

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