直接或从 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 启动脚本中设置了自定义 PATHPYTHONPATHmake 正在以非交互模式运行 /bin/sh,因此它不会读取这些内容。 【参考方案1】:

见 cmets。安装了多个版本的 Python。模块的默认路径在当前 python 的目录结构中,因此搜索到了错误的目录。

在交互模式下,可能是在启动文件中设置了 PATH 环境变量。启动文件还有其他可能性,例如可能会设置一个名为“python”的别名(不会导出别名)。

解决方案是显式使用所需python的完整路径名。

这说明了在脚本中使用 #!/usr/bin/env 的问题 - 它假定环境对于所需的 python 版本总是正确的。使用env 也存在安全问题。

【讨论】:

以上是关于直接或从 Makefile 执行 Python 程序时未找到模块,但在使用“python”运行时工作正常的主要内容,如果未能解决你的问题,请参考以下文章

Python协程实践

Python协程实践

关于Python的协程问题总结

python基础:协程详解

对配置脚本和 Makefile.in 感到困惑

make和makefile