直接或从 Makefile 执行 Python 程序时未找到模块,但在使用“python”运行时工作正常
Posted
技术标签:
【中文标题】直接或从 Makefile 执行 Python 程序时未找到模块,但在使用“python”运行时工作正常【英文标题】:No module found when executing Python program directly or from a Makefile, but works fine when running using "python" 【发布时间】:2016-05-05 15:38:31 【问题描述】:我有一个使用 ElementTree 模块的 python 程序。当我使用“python”运行我的程序时,如下所示......
python myprogram.py
...它工作正常。但是当我从 Makefile 内部运行它时(与上述 Makefile 内部的命令相同),它显示 “ImportError: No module named etree.ElementTree”。当我在第一行添加“#!/usr/bin/env python”并尝试直接执行 myprogram.py 时,我也看到了同样的错误。
我主要对能够从 Makefile 运行我的程序感兴趣(无论是使用“python”命令还是直接执行都无关紧要,只要我可以从 Makefile 执行)。
我在 SO 中找到了 2 个线程,即...
-
ImportError: No module named when module is there
Makefile cannot find module in Python3
...但是这两个线程谈论导入非标准(即定制模块)。鉴于我正在使用标准 python 模块并且我希望能够从 Makefile 运行,我该如何解决这个问题?
【问题讨论】:
您是否安装了多个版本的python?如果是这样,而不是使用env
,那么我建议您使用您打算使用的版本的完整路径。
@cdarke,非常感谢!我确实安装了两个版本并按照您所说的做了,现在我可以直接运行并从 makefile 运行。所以这解决了我的问题。我不明白 - 为什么 - 这解决了这个问题。您也可以将其作为答案而不是评论,以便我可以接受作为答案吗?谢谢!
make
中的@Arash,$PATH
的设置可能与您的 shell 中不同。
您很可能在 shell 启动脚本中设置了自定义 PATH
或 PYTHONPATH
。 make
正在以非交互模式运行 /bin/sh
,因此它不会读取这些内容。
【参考方案1】:
见 cmets。安装了多个版本的 Python。模块的默认路径在当前 python 的目录结构中,因此搜索到了错误的目录。
在交互模式下,可能是在启动文件中设置了 PATH 环境变量。启动文件还有其他可能性,例如可能会设置一个名为“python”的别名(不会导出别名)。
解决方案是显式使用所需python的完整路径名。
这说明了在脚本中使用 #!/usr/bin/env
的问题 - 它假定环境对于所需的 python 版本总是正确的。使用env
也存在安全问题。
【讨论】:
以上是关于直接或从 Makefile 执行 Python 程序时未找到模块,但在使用“python”运行时工作正常的主要内容,如果未能解决你的问题,请参考以下文章