如果Python2在.py文件上运行,由于语法错误(.py文件包含f字符串),尝试显示自定义错误失败

如果Python2在.py文件上运行,由于语法错误(.py文件包含f字符串),尝试显示自定义错误失败,python,string,python-2.7,f-string,Python,String,Python 2.7,F String,我已经编写了一个需要Python3(我们不支持Python2)的程序,但是如果用户不小心在Python2中运行了.py文件,我想包含一条错误消息,通知用户这一点 我尝试在文件的前几行中使用版本检查来执行此操作: import sys if not sys.version_info[0] == 3: sys.exit('You need to run this with Python 3') # Lots of other code here.... # And then... foo

我已经编写了一个需要Python3(我们不支持Python2)的程序,但是如果用户不小心在Python2中运行了.py文件,我想包含一条错误消息,通知用户这一点

我尝试在文件的前几行中使用版本检查来执行此操作:

import sys
if not sys.version_info[0] == 3:
    sys.exit('You need to run this with Python 3')

# Lots of other code here....

# And then...
foo = 2
bar = 3
print(f"Some message that uses f-strings like this: variables are {foo} {bar}")
但是,当实际使用Python2运行.py文件时,它会在使用f字符串的行上返回语法错误。这不太容易理解

有没有办法强制程序在版本检查时失败,从而返回更有用的错误消息

谢谢

有没有办法强制程序在版本检查时失败,从而返回更有用的错误消息

不,因为Python首先必须能够解析和编译您的文件。这意味着您只能在文件中使用受支持的语法,Python 2无法解析f字符串

您必须将项目拆分为多个模块,在要导入的第一个模块中(例如,包的顶级
\uuuuu init\uuuuuy.py
文件),在导入依赖Python-3特定语法的其他模块之前,请执行版本检查


或者根本不包括这些支票。相反,请为项目元数据设置,这样它就不会首先安装在较旧的Python版本中。

您确定它实际上是使用Python2运行的吗<代码>f字符串是在Python
3.6
中引入的,因此您可能正在运行早期的Python3版本。。。如果sys.version\u info<(3,6),请尝试
,看看是否有任何变化。或者更好的是,添加一个
print(sys.version)
只是为了安全起见,f字符串需要Python3.6或更高版本。如果给定的.py文件需要在Python2中工作,则不能使用Python2不支持的语法。@MartijnPieters我认为该文件旨在与Python3一起工作,但OP需要一条描述性消息,以防它与Python2一起运行(在遇到语法错误之前)。我意识到f-string是一个3.6+功能,但我感兴趣的是,当使用较旧版本运行时,我的脚本可能会以自定义方式“失败”,例如说“Version3.6+required”。目前,关于f-string的错误让用户感到困惑,如果他们不小心使用了较旧的Python版本,他们可能会认为软件中有错误。@Tomerikoo:是的,但你不能这样做。必须首先解析和编译整个文件,因为可以执行这些检查。这意味着整个文件必须与Python2兼容。这是有道理的。遗憾的是,语法错误不能像现在这样变得更有用,如果用户不知道什么时候引入了功能,他们会感到困惑。我想我会研究你的另外两个建议。Thanks@SLater01:如果所有文件都必须在该语言的所有旧版本上运行,则永远无法向该语言添加新语法。