不同版本 Python 的条件 shebang 行
Posted
技术标签:
【中文标题】不同版本 Python 的条件 shebang 行【英文标题】:Conditional shebang line for different versions of Python 【发布时间】:2012-08-17 17:20:39 【问题描述】:尝试在两台不同的计算机上运行 python 脚本时遇到问题。在每台计算机上,我想使用 python 版本 2.7.3 运行脚本,但是我遇到的问题是两台计算机以不同的方式命名 python 2.7.3。其中一台计算机运行arch linux,在这台计算机上它被命名为python2。另一台计算机正在运行redhat linux,它使用名称python2.7.3。
我应该在 shebang 行中使用什么,以便脚本可以在两台计算机上执行而无需任何更改?我真正想要的是某种可以选择使用哪个版本的 Python 的有条件的 shebang 行。我是不是运气不好,必须保留两个不同版本的脚本?
附:我不能只使用 #!/usr/bin/env python,因为在 arch linux 计算机上它指的是 python 3.2.3,而在 redhat linux 计算机上它是指 python 2.4。
【问题讨论】:
一个很棒的问题。请注意,推荐的做法(根据 PEP-394)建议将 python2.x 符号链接为python2
,所以这实际上是代表 redhat 的一个打包问题(在其他发行版中)。
为什么不能在每台计算机中定义一个新的变量来链接python2.7.3?还是只是一个链接?
你总是可以选择python2.7.3 my-program.py
:)
我会使用 #!/usr/bin/env python
或 #!/usr/bin/env python2
并保护与版本相关的代码,并明确检查适当的 Python 版本(使用 sys.version_info
)。如果失败了,那么 simlinks 或@Shaung 的解决方案是最简单的。
【参考方案1】:
#!/bin/sh
# -*- mode: Python -*-
""":"
# bash code here; finds a suitable python interpreter and execs this file.
# prefer unqualified "python" if suitable:
python -c 'import sys; sys.exit(not (0x020500b0 < sys.hexversion < 0x03000000))' 2>/dev/null \
&& exec python "$0" "$@"
for pyver in 2.6 2.7 2.5; do
which python$pyver > /dev/null 2>&1 && exec python$pyver "$0" "$@"
done
echo "No appropriate python interpreter found." >&2
exit 1
":"""
import sys
print sys.version
取自https://github.com/apache/cassandra/blob/trunk/bin/cqlsh
【讨论】:
【参考方案2】:您可以编写一个小包装脚本,查看不同版本的 python 可执行文件并使用它找到的那个。
例如:
#!/bin/sh -e
pythons=('python2', 'python2.7.3')
for py_exec in $pythons[@]; do
py_exec="/usr/bin/$py_exec"
if [[ -f $py_exec ]]; then
exec $py_exec $1
fi
done
当然,这个脚本只是一个开始示例,您当然可以通过多种方式对其进行改进。请务必让您了解我的意思。
【讨论】:
以上是关于不同版本 Python 的条件 shebang 行的主要内容,如果未能解决你的问题,请参考以下文章
使用#!/ usr / bin / env python3 shebang和Windows
如何使用 Shebang Line (Python 虚拟环境)