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

10 投票
3 回答
2972 浏览
提问于 2025-04-18 01:05

我有一个作业要交,我非常担心,因为只有一个助教要处理很多项目,可能会用 python 来运行我的程序,而这会调用到 python 2.7。可是我的程序是写给 python3.2 的,应该用这个版本来运行。如果这样的话,就会出现语法错误,我会因此失分。我知道在做一些副项目时,这种情况经常发生,如果助教遇到这种问题,我觉得他可能不会去处理。

我打算提交一个 readme 文件,但我想知道有没有什么简单的方法可以在我的代码里捕捉到这个问题,并打印一条提示信息,告诉大家要用 python3.2 project.py 来重新运行项目。我可以用 try: print "请重新运行项目…" except:pass 这种方式,但有没有更好的办法呢?

3 个回答

5

其实这个问题比你想象的要复杂,想要实现得好并不简单。

假设你有以下代码:

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...

如果你的助教会用一个叫做shebang的方式来执行文件,那样会更好。也许可以问问助教他会怎么运行你的脚本?

7

你可以试着这样开始你的程序:

#!/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)
10

你可以这样做:

import sys
print(sys.version_info)

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

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

你可以利用sys.version_info的值来打印一个警告,当当前运行的Python版本不是你想要的版本时。

你还可以使用:

import platform
print(platform.python_version())

撰写回答