如何使用C API通过完整路径导入文件?

5 投票
6 回答
7798 浏览
提问于 2025-04-15 16:22
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()); 

我觉得这是最可行的解决方案。如果有其他建议也欢迎提出。

撰写回答