【问题标题】:Is there a way to force a Python program to run in version 2.7?有没有办法强制 Python 程序在 2.7 版中运行?
【发布时间】:2016-11-15 01:11:51
【问题描述】:

背景

我有一些 Python 脚本使用仅适用于 Python 2.7 的库,因此我希望能够在 Python 2.7 版中运行这些脚本。

我在想如果我可以在我的 Python 文件顶部放置一些代码来检测它是否在 Python 3 中运行并且如果是的话在版本 2.7 中自行执行 .这可能吗?

例如,伪代码是:

if (self.getPythonVersion != 2.7):
    os.execute('python27 ' + os.cwd + 'script.py')
    exit()

编辑:这是供我个人使用,不用于分发。

回答

我在下面使用了 mgilson 的答案来让它为我工作。我无法让 os.exec() 工作,但我没有花很长时间。第二个脚本对我有用。以下是我使用并为我工作的:

if sys.version_info[:2] > (2, 7):
    code = subprocess.call(['python27', sys.argv[0] ])
    raise SystemExit(code)

【问题讨论】:

  • 你为什么要这样做?
  • 我安装了两个 python 版本,并且一些脚本使用仅适用于 Python2.7 的库,因此我需要在 Python 2.7 中运行这些库
  • 那么您现在如何运行它们?通常我会使用python2 script.py 来运行我的脚本,所以我看不出这会是什么问题。
  • 我使用一个.bat文件来指定python27。我想让它能够通过双击来运行。原因是我与同事共享这些脚本,他们最好不必采取任何额外的步骤来运行脚本。
  • “与同事共享这些脚本”在某种程度上是分布式的,.py 文件打开的默认程序完全基于运行它们的计算机的设置。这些库是您使用的第 3 方吗?如果是这样,您如何确定您的同事也安装了这些库。如果您想制作“点击运行”应用程序,只需将其打包到.exe

标签: python python-2.7 python-3.x


【解决方案1】:

不,这是不可能的,原因很简单,用户可能安装了 python3.x 而没有安装 python2.x。

如果你知道他们已经安装了 python2.7,那么你可以使用类似上面的解决方法,但是,在这种情况下,你必须确保你可以支持python3.x 和 python2.x 都在同一个源中(这通常是一项重要的任务)

您可以通过sys.version_info 检测python 版本,我认为您可以使用os.exec* 系列函数中的某些东西换出该进程... 例如:

import os, sys

if sys.version_info[:2] > (2, 7):
    os.execve('python27', sys.argv, os.environ)

这是您可以尝试的另一种变体(但它会创建一个新进程而不是替换旧进程):

import sys, subprocess

if sys.version_info[:2] > (2, 7):
    code = subprocess.call(['python27'] + sys.argv)
    raise SystemExit(code)

print(sys.version_info)

【讨论】:

  • 我并没有考虑将其分发给其他人。这仅供我个人使用,我确实安装了两个版本。 python27 是我的 PATH 中 Python 2.7 可执行文件的名称。
  • 我收到一条错误消息,提示 Python 正在崩溃。如果我可以让它工作,我会玩并将其标记为答案。
  • 让它工作。我不得不使用第二种解决方案,第一种使用 os.execve(或 execlp/execvp)的方法不起作用,否则会导致 Python 崩溃。无论如何,这很棒。谢谢!我将发布我在问题中使用的脚本,以便其他人可以看到。
【解决方案2】:

您可以尝试在脚本顶部添加 python2.7 shebang 行:

#!/usr/bin/env python2.7

确保它在你的路径中,这应该可以工作。

【讨论】:

  • 这只是表示直接执行时会使用python 2.7,不会阻止用户直接使用python 3运行。
  • @TadhgMcDonald-Jensen 我明白了,感谢您提供这条有用的信息。
  • 我认为查看/usr/bin/env 更可靠——/bin/env 对我来说不存在(OS-X El-Capitan)。
  • 是否有适用于 Windows 的等价物?我没有在我的问题中指定我使用的操作系统;可悲的是,它不是 Linux:P。
  • @Klik 除非您在 Windows 上运行 Cygwin,否则没有。见stackoverflow.com/questions/7574453/…
【解决方案3】:

出于 mgilson 提出的原因,我建议不要这样做。但是,您可以使用以下命令检查 python 版本:

import sys
sys.version_info[0]

如果你还想这样做。

【讨论】:

  • 那么在检测到脚本是在版本 3 中运行时,如何在 Python 2.7 中运行该脚本?
【解决方案4】:

这个丑陋的 hack 应该适用于大多数类 UNIX 系统 exec-magic。它依赖于 python 和 sh 之间的三引号处理差异。首先 sh 运行脚本,然后使用合适的 python 二进制文件重新运行脚本(如果找到)。

#!/bin/sh
_HACK_='''________BEGIN_SH_CODE_____________'
ispy2() {
  case $1$2$3$4$5$6$7$8$9 in
    *ython2.*) return 0 ;;
    *) return 1 ;;
  esac
}
for c in python python2 python3 \
         /usr/local/bin/python* \
         /usr/bin/python* \
         /bin/python*
do
  ispy2 `$c -V 2>&1` && exec $c "$0" "$@"
done
echo "could not find python 2 binary"
exit 1
_HACK_='________BEGIN_PYTHON_CODE___________'''

import sys

print sys.version
print sys.argv

讨厌的ispy2() 函数是一种从python -V 输出中删除空格的hack,以防出现不同的分词行为(我不想依赖/bin/sh 之外的任何二进制文件)。

【讨论】:

    猜你喜欢
    • 2013-02-07
    • 2017-09-02
    • 2022-11-02
    • 1970-01-01
    • 2011-03-28
    • 1970-01-01
    • 2021-11-04
    • 1970-01-01
    • 2018-02-25
    相关资源
    最近更新 更多