使用下一行
pModule = PyImport_Import(pName);
仅从当前目录加载模块。
但我想从其他地方加载什么?这样做有一个简洁的方法吗?
PyRun_SimpleString("import sys\nsys.path.append('<dir>')");
工作,但它有点难看 - 我正在寻找一个更好的方式
谢谢!
答案 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函数来完成你的工作,但我不知道。