Python 部署和 /usr/bin/env 可移植性
-
09-06-2019 - |
题
在我所有可执行 Python 脚本的开头,我将 舍邦 线:
#!/usr/bin/env python
我正在系统上运行这些脚本 env python
产生 Python 2.2 环境。我的脚本很快就会失败,因为我手动检查了兼容的 Python 版本:
if sys.version_info < (2, 4):
raise ImportError("Cannot run with Python version < 2.4")
如果可能的话,我不想更改每个可执行文件上的 shebang 行;但是,我没有机器的管理权限来更改结果 env python
我不想强制使用特定版本,如下所示:
#!/usr/bin/env python2.4
我想避免这种情况,因为系统可能有比 Python 2.4 更新的版本,或者可能有 Python 2.5 但没有 Python 2.4。
优雅的解决方案是什么?
[编辑:]我提出的问题不够具体——我想让用户无需手动配置即可执行脚本(例如路径改变或符号链接 ~/bin
并确保你的路径有 ~/bin
在 Python 2.2 路径之前)。也许需要一些分发实用程序来防止手动调整?
解决方案
“env”只是执行它在 PATH env var 中找到的第一件事。要切换到不同的 python,请在调用脚本之前将该 python 可执行文件的目录添加到路径中。
其他提示
相当黑客的解决方案 - 如果您的检查失败,请使用此功能(可能可以显着改进)来确定可用的最佳解释器,确定它是否可以接受,如果可以,请使用 os.system 或类似的东西以及您的 sys.path 重新启动您的脚本。 argv 使用新的解释器。
import os
import glob
def best_python():
plist = []
for i in os.getenv("PATH").split(":"):
for j in glob.glob(os.path.join(i, "python2.[0-9]")):
plist.append(os.path.join(i, j))
plist.sort()
plist.reverse()
if len(plist) == 0: return None
return plist[0]
如果您正在运行脚本,那么您可以首先将 PATH 变量设置为指向私有 bin 目录:
$ mkdir ~/bin
$ ln -s `which python2.4` ~/bin/python
$ export PATH=~/bin:$PATH
然后,当您执行 python 脚本时,它将使用 python 2.4。您必须更改登录脚本才能更改路径。
或者使用您想要的显式解释器运行 python 脚本:
$ /path/to/python2.4 <your script>
@莫莱斯:这是一个有趣的想法,但我想也许我们可以更进一步。也许有一种方法可以使用 Ian Bicking 的 virtualenv 到:
- 首先看看我们是否在可接受的环境中运行,如果是,则不执行任何操作。
- 检查是否存在特定于版本的可执行文件
PATH
, , IE。检查是否python2.x
存在for x in reverse(range(4, 10))
. 。如果是这样,请使用更好的解释器重新运行该命令。 - 如果不存在更好的解释器,请使用 virtualenv 尝试从旧版本的 Python 安装新版本的 Python,并获取所有必备包。
我不知道 virtualenv 是否能够做到这一点,所以我很快就会去搞乱它。:)
如果您 (1) 完全决定使用 shebangs 并且 (2) 能够在构建过程中使用 Autotools,那么这里有一个解决方案。
我昨晚才发现你可以使用 autoconf 宏 AM_PATH_PYTHON
找到一个最小的Python 2 二进制。操作方法是 这里.
因此,您的流程将是:
- 发出
AM_PATH_PYTHON(2.4)
在你的configure.ac
- 重命名您的所有
.py
脚本到.py.in
(根据我的经验,这不会混淆vi
) - 命名您想要生成的所有 Python 脚本
AC_CONFIG_FILES
. - 而不是开始于
#!/usr/bin/env python
, , 使用#!@PYTHON@
那么你的 结果 Python 脚本总是有一个合适的 shebang。
所以,你有这个解决方案,即使不实用,至少也是可能的。