如何使用C API通过完整路径导入文件?
PyObject* PyImport_ImportModule( const char *name)
如何指定一个完整的文件路径而不是模块名称?
就像 PyImport_SomeFunction(const char *path_to_script, const char *name)
这样。
6 个回答
6
正如上面提到的,使用AlexP提供的解决方案,你无法导入指定目录之外的模块。不过,不是说要设置路径,而是可以添加一个路径,这样Python就会在这个路径下寻找模块。你可以通过把这个路径加到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 );
现在你可以使用常规的方法导入任何文件,格式是<插入文件夹路径>/<文件>.py
。
PyObject* mymodule = PyImport_ImportModule( "<file>" );
如果你想指代当前目录,只需使用"."
作为文件夹路径即可。
6
另一种解决方案适用于所有 *.py 文件都在一个目录中的情况:
PySys_SetPath("path/with/python/files");
PyObject *pModule = PyImport_ImportModule("filename_without_extension");
3
最后,我决定使用imp模块里的load_source:
s.sprintf(
"import imp\n"
"imp.load_source('%s', r'%s')", modname, script_path);
PyRun_SimpleString(s.c_str());
我觉得这是最可行的解决方案。如果有其他建议也欢迎提出。