如果脚本使用Python 2运行,如何引发异常?
我有一个脚本,它应该只与Python3一起运行。我想给出一条很好的错误消息,说明如果用户试图使用python2.x运行该脚本,则不应使用python2运行该脚本 我该怎么做?当我尝试检查Python版本时,它仍然会抛出一个错误,因为Python在执行我的如果脚本使用Python 2运行,如何引发异常?,python,python-3.x,Python,Python 3.x,我有一个脚本,它应该只与Python3一起运行。我想给出一条很好的错误消息,说明如果用户试图使用python2.x运行该脚本,则不应使用python2运行该脚本 我该怎么做?当我尝试检查Python版本时,它仍然会抛出一个错误,因为Python在执行我的if条件之前会解析整个文件 如果可能的话,我不想再写一个剧本 试试这个: import sys #sys.version gives you version number in this format #(2, 5, 2, 'final', 0)
if
条件之前会解析整个文件
如果可能的话,我不想再写一个剧本 试试这个:
import sys
#sys.version gives you version number in this format
#(2, 5, 2, 'final', 0)
version=sys.version_info[0]
if version == 2:
sys.exit("This script shouldn't be run by python 2 ")
您可以编写一个包装器启动脚本,其中只导入实际脚本并捕获语法错误:
try:
import real_module
except SyntaxError:
print('You need to run this with Python 3')
然后,当real_module.py
使用Python3语法(与Python3一起使用时会引发异常)时,将打印上述消息
当然,除了导入脚本,您还可以先检查版本,然后在版本为3时导入。这样做的好处是,即使在使用Python 3运行实际脚本时,您仍然会看到它的语法错误:
import sys
if sys.version_info[0] < 3:
print('You need to run this with Python 3')
sys.exit(1)
import real_module
导入系统
如果系统版本信息[0]<3:
print('您需要使用Python 3运行此命令')
系统出口(1)
导入实数单元
如果脚本在2.x python版本下运行,这将引发错误。您可以使用这样一个事实,即在python 2中,字符串是字节字符串,而在python 3中,字符串是unicode字符串。那你呢
if ' ' == b' ':
raise Exception ('Running this script with Python 2 is not supported')
或
行。请注意,这不需要任何导入,只需要语言功能。这些功能都不能正常工作,因为其他人提到的
SyntaxError
s是首先解析的,除了SyntaxError也不能正常工作
最好的解决方案是包装器模块,但如果由于其他技术或政治原因,您无法在代码中创建另一个模块,则可以执行以下非常肮脏的操作:
z, *y=1,2,3,4 #This script requires requires python 3! A Syntax error here means you are running it in python2!
python2.7中的结果将是:
File "notpython2.py", line 3
z, *y=1,2,3,4 #This script requires requires python 3! A Syntax error here means you are running it in python2!
^
SyntaxError: invalid syntax
是的,代码很难看,但是如果有人能想出一个更好的解决方案,尽管有一个新的模块,请将它添加到这里。如果它是一个
SyntaxError
,你无法避免它;正如您所说,错误出现在您编写的任何代码运行之前。您必须编写在两个版本中都在语法上有效的代码。您需要首先修复语法错误,然后担心版本检查。在@BurhanKhalid中有一些有趣的想法:该脚本使用的Python 3功能在Python 2中是非法的,因此语法错误只是Python 2解释器的语法错误。用Python3编写的人不应该被迫编写在Python2中也是合法的代码。@PM2Ring如果他们想让它在2.x中运行,他们应该这样做!即使只是自定义错误消息…同样,在运行此脚本之前可能会抛出语法错误。希望在不生成其他脚本的情况下找到方法。难道不可能用一个脚本来完成吗?不,正如其他人在评论中所说,在解释器运行任何代码之前,整个脚本都会被解析。因此,在您可能添加的任何代码运行之前,将抛出一个语法错误。@AJK这是您唯一的选择,原因已经向您解释过了。同样,如果有语法错误,它不会走到这一步。上面的一行必须是脚本的第一行。当代码执行时,它将在开始时检查python版本。不管它在脚本中的什么位置,如果代码中存在实际的SyntaxError
,python都不会开始运行该文件。
z, *y=1,2,3,4 #This script requires requires python 3! A Syntax error here means you are running it in python2!
File "notpython2.py", line 3
z, *y=1,2,3,4 #This script requires requires python 3! A Syntax error here means you are running it in python2!
^
SyntaxError: invalid syntax