Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/362.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主要版本_Python - Fatal编程技术网

通过源代码分析检测Python主要版本

通过源代码分析检测Python主要版本,python,Python,有没有一个工具可以检测代码库中使用的主要Python版本?我需要能够检查源代码并确定要使用哪个版本的Python来执行该代码 我考虑过的一种方法是看看2to3是否表示有任何变化。任何建议都会指出Python2,否则我可以假设Python3。不过,这感觉有点笨拙,所以我想知道是否有更好的方法。一个粗略的想法: 使用编译源代码,分别使用Python2和Python3执行两次,然后查看是否出现错误 这是为了区别于语法。一个同时适合2和3的源可以简单地判断为“两者” 此外,这是一种静态方法,无法从需要运

有没有一个工具可以检测代码库中使用的主要Python版本?我需要能够检查源代码并确定要使用哪个版本的Python来执行该代码

我考虑过的一种方法是看看2to3是否表示有任何变化。任何建议都会指出Python2,否则我可以假设Python3。不过,这感觉有点笨拙,所以我想知道是否有更好的方法。

一个粗略的想法:
使用编译源代码,分别使用Python2和Python3执行两次,然后查看是否出现错误

这是为了区别于语法。一个同时适合2和3的源可以简单地判断为“两者”

此外,这是一种静态方法,无法从需要运行时的信息中推断,例如:

import a_python_2_specific_module
这意味着代码仅为Python2,但检测这一事实似乎超出了方法的能力

注意:
请注意,如果您实际调用不受信任的源代码(如将其提供给解释器或
eval
),则强烈建议您不要这样做。

您可以在代码中使用
eval
进行检查:

try:
  eval("1 if True else 2")
except SyntaxError:
  #

或者一些未来的版本,而不是在所有的版本

一般来说,这实际上是不可能的。你可以做一些事情,比如检测只存在于一个主要版本中的语法特性(例如,print语句表示Python 2),但是如果一个程序在Python 2和Python 3中都是语法有效的,那么你真正能做的就是猜测。这是一个很好的观点。我想对这个问题更好的解释是如何检测代码是否一定是一个或另一个。如果可能的话,那么我将不得不做出一个人的选择。如果你想让这一切顺利进行,你真的需要加入大量的启发法。但是在这两个版本上工作的大量代码是什么呢?这取决于OP从哪里获得源代码。对于不受信任的源代码,我强烈建议不要运行它们。请注意,即使是非恶意代码也可能有非平凡的危险副作用。这就是我想我将要使用的方法。这种想法的一个潜在问题是,编译会因许多与2/3差异无关的错误(例如语法错误)而失败,因此使用2to3可能会更健壮,但只有实验才能真正说明问题。@abingham:2to3没有版本检测;为什么会这样?它假定其输入是为Python 2编写的。它不会在看Python3源代码时说“工作完成了”;它将进行类似于
print(1,2)
->
print((1,2))
@user2357112:这一点很好。我没有意识到2to3是这样做的。FWIW,我并不期望2to3本身能做“版本检测”,但我希望我能变得懒惰,依靠它对python3代码“什么都不做”。我得到的反馈越多,就越清楚我真的需要实现一系列单独的测试a la 2to3。