python == python2 还是 python == python3 ?如何打包、分发python py2k脚本?

python == python2 还是 python == python3 ?如何打包、分发python py2k脚本?

根据系统的不同,python==python2python== 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。

相关内容