【问题标题】:Python C api PyImport_importmodule fail when the file has an import statement当文件具有导入语句时,Python C api PyImport_importmodule 失败
【发布时间】:2016-05-10 07:04:07
【问题描述】:

我尝试使用Python C api在C++中从python调用一个函数,测试成功。

但是如果我打算导入一个已经导入其他模块的模块,Pymodule_findmodule 将返回 Null,即使它在那里并创建了一个编译文件。这是我的代码

Py_Initialize();
PySys_SetPath("C:/Users/Mik/Documents/GitHub/youtube-dl");      
PyObject * pythonFile = PyImport_ImportModule("test2");

这是该目录中名为 test2.py 的 python 文件,其中包含一个名为 test_dl.py 的文件和一个名为 TESTDL 的类

from test_dl import TESTDL 
def someFunction(someInput):
    return 12345

添加导入行后,我的程序不再将其识别为模块

编辑:原来 test_dl 的第一行为:

 from __future__ import unicode_literals

这就是我收到此 ImportError 的原因:没有名为 future

的模块

谢谢!

【问题讨论】:

  • 听起来您在尝试导入test_dl 或从中检索TESTDL 对象时可能遇到了异常。
  • 在您致电PyImport_ImportModule("test2") 后,PyErr_Print() 会打印什么?

标签: python c++ python-import python-c-api


【解决方案1】:

PySys_SetPath() 的函数调用会完全覆盖 Python 模块路径。结果是您的 Python 脚本 test_dl 找不到 Python 系统模块(在本例中为 __future__)并引发异常。

您需要做的是将模块的目录追加到系统路径中。为此,首先查询系统路径的现有值,然后将路径添加到其中:

PyObject *sys_path = PySys_GetObject("path");
PyList_Append(sys_path, PyString_FromString("C:/Users/Mik/Documents/GitHub/youtube-dl"));

【讨论】:

  • 非常感谢 :) 没有意识到我也需要 python 库
  • 仅适用于 Python >=2.7。这里有一个更兼容的版本: append_path = PYTHON_PATH ":."; //append_path = '"'PYTHON_PATH:."; setenv("PYTHONPATH", append_path, 1); //将PYTHONPATH设置为工作目录
  • PyString_FromString 不符合 python >3.5,请改用 PyUnicode_FromString
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-02-09
  • 1970-01-01
  • 1970-01-01
  • 2016-11-20
  • 1970-01-01
  • 1970-01-01
  • 2012-11-13
相关资源
最近更新 更多