Python嵌入:PyImport_Import不是来自当前目录

时间:2014-01-22 10:12:34

标签: python c python-embedding

使用下一行

pModule = PyImport_Import(pName);

仅从当前目录加载模块。

但我想从其他地方加载什么?这样做有一个简洁的方法吗?

PyRun_SimpleString("import sys\nsys.path.append('<dir>')"); 工作,但它有点难看 - 我正在寻找一个更好的方式

谢谢!

2 个答案:

答案 0 :(得分:11)

刚刚找到我在http://realmike.org/blog/2012/07/08/embedding-python-tutorial-part-1/

寻找的答案
  

通常,在导入模块时,Python会尝试查找模块   导入模块旁边的文件(包含导入的模块)   声明)。 Python然后尝试“sys.path”中的目录。该   通常不考虑当前的工作目录。在我们的例子中,   导入是通过API执行的,因此没有导入模块   其目录Python可以搜索“shout_filter.py”。插件   也不在“sys.path”上。一种让Python找到的方法   插件是将当前工作目录添加到模块搜索中   通过API执行相当于“sys.path.append('。')”的路径。

Py_Initialize();
PyObject* sysPath = PySys_GetObject((char*)"path");
PyObject* programName = PyString_FromString(SplitFilename(argv[1]).c_str());
PyList_Append(sysPath, programName);
Py_DECREF(programName);

SplitFilename是我为获取目录而写的函数。

答案 1 :(得分:-1)

有一种很好的方法,因为这是对网站包经常使用的方式。

import sys
sys.path.append(directory) # sys.path is a list of all directories to import from

或您使用

os.cwd(directory) # change the working directory

导入之前。

另一种方式很难看:

import types, sys
m = types.ModuleType('module')
sys.modules['module'] = m
exec open('file').read() in m.__dict__ # python3

也许你要求一个C函数来完成你的工作,但我不知道。