根据系统的不同,python
==python2
或python
== python3
。
可执行的 Python 脚本,开头为:
#!/usr/bin/env python
#!/usr/bin/env python2
#!/usr/bin/env python3...
对于 python py3k 来说是文档中提供我应该/可以将其与版本号一起使用,所以我这样做:
#!/usr/bin/env python3
但我发现 py2k 脚本有问题。
而在py2k 文档它被编写为使用:#! /usr/bin/env python
,
在某些 *nix-es 上 python py3k 是默认的,所以 python==python3。 (例如ArchLinux python 包, 这里python 包文件)。
如何打包(配置、制作)和/或准备用于分发的 python 脚本来处理这个问题?
我询问制作可以由用户轻松运行的软件包(无需修改他们的环境)
我可以对 python py2k 脚本执行与 python py3k 脚本相同的技巧并将其设置为:#!/usr/bin/env python2
吗?我可以确定每个 python py2k 发行版都包含python2
文件,所以#!/usr/bin/env python2
可以工作吗?
如果是,为什么不建议将其作为标准,例如在python py2k 文档?
答案1
脚本可以检查其 Python 版本,如果是 Python 3,则使用 Python 2 重新启动。在脚本头部附近添加以下内容:
if sys.version > '3':
python2 = os.popen('which python2 2> /dev/null').read().rstrip()
if python2:
args = sys.argv[:]
args.insert(0,python2)
os.execv(python2,args)
else:
sys.exit("%s requires Python Version 2 (python2 not in PATH)" % os.path.basename(__file__))
这使用系统which
命令python2
在环境的PATH
.然后它会重新启动(或者如果找不到它则中止)。
请注意,该脚本确实需要是有效的 Python 3 语法才能在 Python 3 中启动。
此外,任何输出都应该在调用之前刷新execv
,否则将会丢失。例如,sys.stdout.flush()
在调用之前添加execv
将刷新任何print
语句。
答案2
在旧版本上,可能只是python
代替python2
.为了使您的 sheebang 线更清晰,您可以创建一个链接,python2 -> python
以便您可以使用#!/usr/bin/env python2
.
答案3
我认为“标准”的定义是https://www.python.org/dev/peps/pep-0394/
此 PEP 提供了一个约定,以确保 Python 脚本可以继续跨 *nix 系统移植,而不管 Python 解释器的默认版本(即 python 命令调用的版本)如何。
- python2 指的是 Python 2.x 的某个版本。
- python3 将指代 Python 3.x 的某些版本。
- 目前,所有发行版都应确保 python 引用与 python2 相同的目标。
- 然而,最终用户应该意识到,python 至少在 Arch Linux 上指的是 python3(该更改促使创建此 PEP),因此 python 应该仅在与 Python 2 源代码兼容的脚本中用于 shebang 行和 3.
- 为了准备 Python 默认版本的最终更改,仅适用于 Python 2 的脚本应更新为与 Python 3 源兼容,或者在 shebang 行中使用 python2。