【问题标题】:How to call a python file, that needs to import packages?如何调用需要导入包的python文件?
【发布时间】:2014-01-30 01:54:37
【问题描述】:

我正在按照教程从 the python docs 的 C++ 程序中调用 python 代码。

尝试调用multiply 示例时一切正常。现在,如果我在导入库的 python 源代码中添加一行,比如说openpyxl

from openpyxl import load_workbook

我收到来自 python 的错误

ImportError: No module named openpyxl

我认为如果我导入一个系统库,我不会有任何问题,但如果我尝试导入datetime,我也会收到错误。

如果我从 python 控制台导入文件,我没有任何错误。 openpyxl 库已安装在我的系统中。

所以我的问题是:如何导入需要导入包的python源代码?

编辑:好的,我忘了提一些事情,我对你们没有完全诚实,对不起。

尝试运行示例时遇到问题:我无法让 python 找到我的multiply.py 文件,并且PyImport_Import 行总是返回null

我的解决方案是使用PySys_SetPath 添加我知道我的python 源的路径。问题是我刚刚意识到这个函数不会追加一个新目录,它只是覆盖了PYTHONPATH。所以现在python可以找到multiply.py,但绝对是别的。

当然我已经删除了那行但现在我有另一个问题,如果文件只是在 C++ 编译程序的同一目录中,为什么 python 找不到我的源?

我意识到我的python控制台中的sys.path与我的嵌入式python中显示的路径有点不同:第一个在列表的开头有一个空字符串@987654335 @。我不是 python 专家,但是当我将该行添加到我的路径时,我可以导入 multiply.py 所以这似乎是我无法导入相对于我的可执行文件的模块的原因是缺少这个空路——但还是不知道是什么意思——。

我要感谢@paul-evans,他给了我添加路径以查找我的文件的想法。

【问题讨论】:

  • 您的系统上是否安装了多个版本的python?
  • 我有 python 2.7、python 3 和 python 3.3。我很确定我通过调用PyRun_SimpleString("import sys\nprint(sys.version)"); 使用的是 2.7 版本
  • PYTHONPATH 变量只能在site.py 中读取,因此如果由于某种原因您的解释器没有读取此文件,您的PYTHONPATH 将被忽略。

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


【解决方案1】:

这就是PYTHONPATH 的用途。您可以将其设置为包含列表模块目录的环境变量,或者在代码本身中设置如下:

import sys
sys.path.append("path/to/openpyxl/module")

【讨论】:

  • 好的,它实际上可以找到openpyxl,但尝试加载datetime 包仍然失败...我必须附加我的库需要的每个目录吗?
  • 找不到datetime 模块看起来更像是一个安装问题,但将其添加到 PYTHONPATH 将作为临时修复。自安装以来,您是否重新组织了 python 目录?您也可以尝试重新安装 python。
  • 我使用的是安装了 ubuntu 13.10 的标准 python 2.7.5。并且从 python 控制台不会出现查找位置的问题。我认为这可能是一个临时修复,但我需要找到一个更好的,这个程序旨在在 Windows 机器上工作:/
  • 问题是我覆盖了我的 PYTHONPATH。最后添加sys.path.append('') 为我工作。谢谢。
猜你喜欢
  • 2021-12-04
  • 1970-01-01
  • 1970-01-01
  • 2021-09-06
  • 2012-04-03
  • 2021-06-06
  • 1970-01-01
  • 1970-01-01
  • 2016-09-08
相关资源
最近更新 更多