从不同的目录中调用多个python函数

我有一些代码将转到目录(文件夹1用于演示目的),然后在文件python_function.py中调用一个名为function的函数.代码如下所示:

#include <Python.h>
#include <string>
#include <iostream>

int main()
{
    PyObject *pName, *pModule, *pDict, *pFunc;

    setenv("PYTHONDONTWRITEBYTECODE", " ", 1);

    // Initialize the Python Interpreter
    Py_Initialize();

    //CALL FUNCTION FROM FOLDER 1:
    std::wstring pathWide = L"./Folder 1";
    PySys_SetPath(pathWide.c_str());

    // Build the name object
    pName = PyUnicode_FromString((char*)"python_function");
    // Load the module object
    pModule = PyImport_Import(pName);
    // pDict is a borrowed reference
    pDict = PyModule_GetDict(pModule);
    // pFunc is also a borrowed reference
    pFunc = PyDict_GetItemString(pDict, (char*)"function");

    if (pFunc != NULL)
    {
        if (PyCallable_Check(pFunc))
        {
            PyObject *pResult;

            pResult = PyObject_CallFunction(pFunc, "");

            Py_DECREF(pResult);
        }
        else {PyErr_Print();}
    }
    else {std::cout << "pFunc is NULL!" << std::endl;}

    // Clean up
    Py_DECREF(pFunc);
    Py_DECREF(pDict);
    Py_DECREF(pModule);
    Py_DECREF(pName);

    // Finish the Python Interpreter
    Py_Finalize();

    return 0;
}

这段代码在我的系统上编译并完美运行,但是一旦我想在第二个目录中调用另一个函数,称为文件夹2,我就会收到错误:Segmentation Fault(core dumped).这是代码:

#include <Python.h>
#include <string>
#include <iostream>

int main()
{
    PyObject *pName, *pModule, *pDict, *pFunc;

    setenv("PYTHONDONTWRITEBYTECODE", " ", 1);

    // Initialize the Python Interpreter
    Py_Initialize();

    //CALL FUNCTION FROM FOLDER 1:
    std::wstring pathWide = L"./Folder 1";
    PySys_SetPath(pathWide.c_str());

    // Build the name object
    pName = PyUnicode_FromString((char*)"python_function");
    // Load the module object
    pModule = PyImport_Import(pName);
    // pDict is a borrowed reference
    pDict = PyModule_GetDict(pModule);
    // pFunc is also a borrowed reference
    pFunc = PyDict_GetItemString(pDict, (char*)"function");

    if (pFunc != NULL)
    {
        if (PyCallable_Check(pFunc))
        {
            PyObject *pResult;

            pResult = PyObject_CallFunction(pFunc, "");

            Py_DECREF(pResult);
        }
        else {PyErr_Print();}
    }
    else {std::cout << "pFunc is NULL!" << std::endl;}

    //CALL FUNCTION FROM FOLDER 2:
    pathWide = L"./Folder 2";
    PySys_SetPath(pathWide.c_str());

    // Build the name object
    pName = PyUnicode_FromString((char*)"python_function");
    // Load the module object
    pModule = PyImport_Import(pName);
    // pDict is a borrowed reference
    pDict = PyModule_GetDict(pModule);
    // pFunc is also a borrowed reference
    pFunc = PyDict_GetItemString(pDict, (char*)"function");

    if (pFunc != NULL)
    {
        if (PyCallable_Check(pFunc))
        {
            PyObject *pResult;

            pResult = PyObject_CallFunction(pFunc, "");

            Py_DECREF(pResult);
        }
        else {PyErr_Print();}
    }
    else {std::cout << "pFunc is NULL!" << std::endl;}

    // Clean up
    Py_DECREF(pFunc);
    Py_DECREF(pDict);
    Py_DECREF(pModule);
    Py_DECREF(pName);

    // Finish the Python Interpreter
    Py_Finalize();

    return 0;
}

我调用第一个函数后发生错误,所以它似乎没有更改目录或其他东西.我正在使用Ubuntu,我有python 3.4

我尝试了其他更改目录的方法,不仅仅是PySys_SetPath,还有setenv(“PYTHONPATH”,path,1);

注意:我现在不担心错误检测,我宁愿让代码在理想情况下工作,然后担心不完美的情况.

编辑:

调试输出:

#0 0x7ffff79b16cb   PyModule_GetDict() (/usr/lib/x86_64-linux-gnu/libpython3.4m.so.1.0:??)
#1 0x4010e6 main() (/home/ben/Documents/Programming/Projects/PYTHON TEST/main.cpp:23)

奇怪的是,调试表明错误发生在第23行,但如果运行第一个代码段,第23行不会导致错误

对PETER BRITTAIN的回应:

如果我用PyImport_ReloadModule()替换第二个PyImport_Import(),我得到一个错误打印到控制台,如下所示:

ImportError: No module named 'imp'
Error in sys.excepthook:
Traceback (most recent call last):
  File "/usr/lib/python3/dist-packages/apport_python_hook.py", line 53, in apport_excepthook
    if not enabled():
  File "/usr/lib/python3/dist-packages/apport_python_hook.py", line 24, in enabled
    import re
ImportError: No module named 're'

Original exception was:
ImportError: No module named 'imp'
最佳答案
编辑:更新了发现的错误的进一步答案.

您无法在调试输出中导入模块.在调试器外部运行时,您可以点击不能使用相同的导入调用导入的问题.完整的问题链是这样的.

调试时:

>您的调试器未设置正确的当前工作目录.
>相对路径无效,但PySys_SetPath()接受.
>因此,您从PyImport_Import()获取NULL,表示导入失败(如调试器下的here所示).
>由于您没有检查错误,因此将NULL传递给下一个函数,该函数尝试取消引用指针并因分段错误而失败.

我遇到了Python2.7的问题(使用char *而不是wchar * – 如下面的评论中所述).正常运行时将其放在一边:

>相对路径有效并由PySys_SetPath()接受.
>因此,您第一次设法加载模块.
>然后,您将运行其余代码,但这次它在第二次导入时出现分段错误.这是因为您无法以这种方式重新加载模块.您需要使用PyImport_ReloadModule()代替.
>即使使用该修复程序,您也发现无法加载标准库.那是因为你删除了系统路径的其余部分.您需要遵循建议here.

所以,修复是:

>使用std :: string而不是std :: wstring(对于Python 2.x).
>重新加载模块时使用PyImport_ReloadModule().
>确保在设置路径时包含完整的sys.path.
>检查错误 – 对于大多数问题,我使用PyErr_Print()得到了明确的模块导入错误.

转载注明原文:从不同的目录中调用多个python函数 - 代码日志