有没有办法强制Python程序在2.7版本中运行?

时间:2016-07-12 16:54:52

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

背景

我有一些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)

4 个答案:

答案 0 :(得分:5)

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

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

您可以通过sys.version_info检测python版本,我认为您可以使用os.exec*函数系列中的某些内容替换该过程... e.g:

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)

答案 1 :(得分:3)

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

#!/usr/bin/env python2.7

确保它在您的路径中,这应该有用。

答案 2 :(得分:0)

这个丑陋的黑客应该适用于大多数类UNIX系统exec-magic。它依赖于python和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输出中删除空格,以防出现不同的分词行为(我不想依赖/bin/sh之外的任何二进制文件)

答案 3 :(得分:-1)

我会因为mgilson提出的理由而反对这一点。但是你可以用以下方法检查python版本:

import sys
sys.version_info[0]

如果您仍想这样做。