有没有办法防止在python 2中调用python 3脚本?

时间:2014-04-02 22:38:22

标签: python python-3.x

我必须完成一项任务,我非常担心,因为单个TA有许多项目要运行,所以将使用python调用它,它将调用python 2.7,当时程序是为python3.2编写的,应该以这种方式调用。这会导致语法错误,我会松散点。我知道在进行辅助项目时,这种情况会发生很多,如果TA遇到这种情况,我认为他不会跟进。

我要提交一个readme,但我想知道是否有办法在我的代码中捕捉到这一点而不用大惊小怪,并打印一条声明说要重新运行项目为python3.2 project.py。我可以try: print "Rerun project…" except:pass,但有更好的方法吗?

3 个答案:

答案 0 :(得分:8)

你可以这样做:

import sys
print(sys.version_info)

从Python 2.7开始,您还可以使用:

print(sys.version_info.major, sys.version_info.minor, sys.version_info.micro)

当目前正在运行的Python版本不符合要求时,您可以使用sys.version_info的值来打印警告。

您也可以使用:

import platform
print(platform.python_version())

答案 1 :(得分:2)

这实际上是一个难以实现的问题,你可能会初步想到。

假设您有以下代码:

import platform
import sys

if platform.python_version().startswith('2'):
    # This NEVER will be executed no matter the version of Python
    # because of the two syntax errors below...
    sys.stdout.write("You're using python 2.x! Python 3.2+ required!!!")
    sys.exit()     
else:
    # big program or def main(): and calling main() .. whatever
    # later in that file/module:
    x, *y=(1,2,3)      # syntax error on Python 2...
    # or
    print 'test'       # syntax error on Python 3...

else子句下的两个语法错误之一是在实际执行if之前生成的,无论用于运行它的Python版本如何。因此,程序不会像您期望的那样优雅地退出;无论如何,它都会因语法错误而失败。

解决方法是将您的实际程序放在外部文件/模块中并以try/except这样包装:

try:
    import Py3program    # make sure it has syntax guaranteed to fail on 
                         # Python 2 like    x, *y=1,2,3
except SyntaxError:
    sys.stdout.write(error message)
    sys.exit()

# rest of the Python 3 program...

如果您的TA将使用sheebang执行该文件,那么这仍然是一种更好的方法。也许问TA如何运行你的脚本?

答案 2 :(得分:0)

如何像这样启动程序:

#!/usr/bin/env python
# -*- coding: utf8 -*-

import sys

if sys.version_info < (3,0,0):
    print(__file__ + ' requires Python 3, while Python ' + str(sys.version[0] + ' was detected. Terminating. '))
    sys.exit(1)