Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如果脚本使用Python 2运行,如何引发异常?_Python_Python 3.x - Fatal编程技术网

如果脚本使用Python 2运行,如何引发异常?

如果脚本使用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)

我有一个脚本,它应该只与Python3一起运行。我想给出一条很好的错误消息,说明如果用户试图使用python2.x运行该脚本,则不应使用python2运行该脚本

我该怎么做?当我尝试检查Python版本时,它仍然会抛出一个错误,因为Python在执行我的
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