的PyObject * PyImport_ImportModule(常量字符*名)

如何指定一个完整的文件路径,而不是和一个模块名称?

PyImport_SomeFunction(const char *path_to_script, const char *name)

谢谢, 利亚

有帮助吗?

解决方案 4

最后,我结束了使用从IMP模块load_source:

s.sprintf( 
  "import imp\n" 
  "imp.load_source('%s', r'%s')", modname, script_path); 
PyRun_SimpleString(s.c_str()); 

我认为是最可行的解决方案。其他建议是受欢迎的。

其他提示

有关案件的另一解决方案,当所有* .py文件是在一个目录中:

PySys_SetPath("path/with/python/files");
PyObject *pModule = PyImport_ImportModule("filename_without_extension");

我不能给你一个完整的答案,但我想我可以给你一个地方开始。 Python提供了一个内置的模块调用imp它提供了导入内部访问。它包括一个功能load_module(),它可以让你在一个道路通行。这在的Python / import.c <实施/ A>;只需搜索imp_load_module

正如所指出的,使用上述溶液通过AlexP,不能导入指定的目录中的任何模块外部。然而,作为替代的设置的路径,则可以添加的路径,这是要搜索的模块。这可以通过追加路径的sys.path 来完成。不幸的是,C API不公开的功能,能够直接做到这一点。相反,你可以问Python本身做到这一点,使用

PyRun_SimpleString( "import sys\nsys.path.append(\"<insert folder path>\")\n" );

或类似的任何等效的:的(警告:未经测试)

PyObject* sys = PyImport_ImportModule( "sys" );
PyObject* sys_path = PyObject_GetAttrString( sys, "path" );
PyObject* folder_path = PyUnicode_FromString( "<insert folder path>" );
PyList_Append( sys_path, folder_path );

现在可以使用通常的

导入任何文件<insert folder path>/<file>.py
PyObject* mymodule = PyImport_ImportModule( "<file>" );

要参考当前目录,只需使用"."作为文件夹路径。

的CPython将不通过犹豫以呼叫imp模块进行导入作业,所以没有理由,你不应该自己做。

这里有一种方法来做到这一点在C ++,其中modulePathmoduleName是因为懒惰的独立变量:

PyObject* loadModule(const char* modulePath, const char* moduleName)
{
    auto modules = PyImport_GetModuleDict();
    auto impModule = PyDict_GetItemString(modules, "imp");
    if (impModule)
    {
        // GetItemString returns a borrowed reference, but ImportModule
        // returns a new reference, so INCREF here to even it out
        Py_INCREF(impModule);
    }
    else
    {
        impModule = PyImport_ImportModule("imp");
        if (!impModule)
        {
            // we've tried hard enough, bail out
            PyErr_Print();
            return nullptr;
        }
    }

    // The Python API asks for non-const char pointers :(
    char methodName[] = "load_source";
    char args[] = "ss";
    auto module = PyObject_CallMethod(impModule, methodName, args, moduleName, modulePath);

    Py_XDECREF(impModule);
    Py_XDECREF(modulePath);
    return module;
}

我写此基础上我的项目之一Python模块加载,它使用引用计数票友管理,我没有尝试过这一项,所以在使用您自己的风险。

我已验证的 stesim 替代的工作原理。

没有该溶液用于物质,它提及的窗口上具有与斜线代替反斜线的完整路径是很重要的是重要的。

path = "C:\\path\\to\\module\\module.py" // wrong
path = "C:/path/to/module/module.py"     // correct

在一些其它的问题和答案(如在python Windows路径)中指出,第一变型应该工作了。我无法得到它的工作方式我尝试任何方法。

scroll top