我有一些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)
答案 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]
如果您仍想这样做。