python == python2或python == python3吗?如何打包,分发python py2k脚本?


10

取决于系统,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 package,这里是python package files)。

如何打包(配置,制作)和/或准备python脚本进行分发以处理该问题?

我问有关制作易于用户运行的软件包(无需修改环境)的问题

我可以对python py2k脚本和python py3k脚本执行相同的技巧并将其设置为:#!/usr/bin/env python2吗?我可以确定每个python py2k发行版都包含python2文件,因此#!/usr/bin/env python2可以正常工作吗?

如果是,为什么不建议将其作为标准,例如在python py2k文档中


4
据我所知,您始终python2可以运行它(如果已安装),并且始终可以使用来检查版本python -V。如果您希望python将其设为2或3,则应该rm /usr/bin/python然后创建指向您想要的python版本(例如)的符号链接ln -s /usr/bin/python2.5 /usr/bin/python
Hanan N.

感谢您向我保证python2。我想知道为什么在有py2k和py3k时默认使用它是不标准的python?关于移除建议,您的建议如何?不适合该示例,因为我询问包装问题。我想制作可以在不同配置/系统中运行的软件包。无法修改环境。据我所知,如何检查-不适用于Shebang
Grzegorz Wierzowiecki 2011年

我相信@Hanan N.试图告诉您的是,如果您正在编写Python 2.x代码,请#!...python2在程序中使用,如果您正在使用Python 3.x,则请使用#!...python3。如果您知道操作系统仅适用于特定版本,请不要依赖操作系统来获得正确的链接。我使用仍安装了Python 1.5.2的系统进行工作/usr/bin/python-我编写代码以处理较旧的Python版本或使用python2
Arcege 2011年

2
@Arcege python2我的系统上没有可执行文件(Debian压缩)。python是的符号链接python2.6python3也是的符号链接python3.1,但没有python2
吉尔(Gilles)“所以,别再邪恶了”,

Answers:


3

脚本可以检查其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语句。


1

在较旧的版本中,可能只存在python而不是python2。为了使您的sheebang线条更清晰,您可以创建一个链接,python2 -> python以便可以使用#!/usr/bin/env python2


但是,它不能解决所述问题。因为问题是如何使脚本具有足够的可移植性,所以它可以在所有提到的环境中运行(使用“ python”,“ python2”等)
Grzegorz Wierzowiecki 2013年

1

我认为“标准”是在https://www.python.org/dev/peps/pep-0394/中定义的

该PEP提供了一个约定,以确保无论Python解释程序的默认版本(即python命令调用的版本)如何,Python脚本都可以继续在* nix系统上移植。

  • python2将引用某些版本的Python2.x。
  • python3将引用某些版本的Python3.x。
  • 目前,所有发行版都应确保python与python2指向同一目标。
  • 但是,最终用户应注意,至少在Arch Linux上python引用了python3(这一更改促使创建了该PEP),因此python应该仅在shebang行中用于与两个Python 2源兼容的脚本和3。
  • 为了准备最终更改默认版本的Python,应该将仅Python 2的脚本更新为与Python 3源兼容,或者在shebang行中使用python2。
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.