【问题标题】:Python Embedding: PyImport_Import not from the current directoryPython 嵌入:PyImport_Import 不是来自当前目录
【发布时间】:2014-01-22 10:12:34
【问题描述】:

使用下一行

pModule = PyImport_Import(pName);

只从当前目录加载模块。

但是我想从其他地方加载什么?有没有一种巧妙的方法?

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

谢谢!

【问题讨论】:

  • 真的是<dir>在python路径中吗? AFAIK PyImport_Import(<module-name>) 应该与 python 的 import <module-name> 相同。如果它不在 python 路径中,那么 为什么 你希望它能够工作吗?当然你可以做sysModule = PyImport_Import("sys"),然后使用PyObject_GetAttr访问sys.path并调用PyList_Append,但它似乎比使用PyRun_SimpleString更长(尽管它应该有更少的开销,因为它不需要编译并解释代码。
  • @Bakuriu - 我刚刚找到了答案 - 下面

标签: python c python-embedding


【解决方案1】:

刚刚在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 是我为获取目录而编写的函数。

【讨论】:

【解决方案2】:

有一个很好的方法,因为这是站点包经常使用的方法。

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 函数来完成你的工作,但我不知道。

【讨论】:

  • 你的意思是 PyRun_SimpleString("import sys\nsys.path.append('<dir>')"); 工作,但它有点难看 - 我正在寻找更好的方法
  • 感谢您的指出。我现在读了这个问题。我只是无法正确分类“丑陋”。请将此视为一个负面示例,这样您就不会得到任何其他此类答案。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-06-18
  • 2014-01-03
  • 2013-06-22
  • 1970-01-01
  • 2015-09-04
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多