如何列出系统中安装的所有Python版本?

9
我需要向用户呈现一个Python安装列表,供其选择执行某些操作。我想在Windows中,我可以从注册表中获取此信息。不知道Linux和Mac怎么做。
有什么提示吗?或者你甚至知道一个可以找到此Python代码的地方吗?
编辑:找到所有解释器并不重要。从标准位置找到解释器就足够了。同意,这并不是太难的事情,但我只是希望也许有人已经编写了此功能的代码,或者我可能已经在stdlib中忽略了它。

操作系统?还是你的意思是跨平台解决方案? - Torxed
4
你的问题是什么?也许有比查找所有安装版本更简单的解决方案来解决你实际的问题。 - thefourtheye
3
如果用户不想使用路径上的Python版本,您可以确定Python的版本,并要求用户选择Python安装位置。其他方式会过于麻烦并且无法保证可靠性。 - RaviH
你可以通过 os.walk() 搜索 Python 可执行文件,但是如果你无法聪明地找到搜索位置,这将非常缓慢。 - wnnmaw
1
做不到,别费劲了。如果你想找几个候选者,可以查看环境变量,在which中找到Python 2和3,并在~/.virtualenvs中进行搜索。像find / -name "python" 2> /dev/null这样的命令将会找到名为python的文件,但这些文件可能是或者不是Python解释器。无论如何,你都需要让用户通过对话框指定他们自己的解释器。 - wim
显示剩余5条评论
3个回答

4
我正在编写一个Python IDE,希望让用户选择执行程序的解释器。像其他IDE一样提供一个对话框即可,用户可以添加他们想要运行代码所需的解释器。例如,Eclipse为Java运行时环境提供此功能,并且这样做是完全合适的。特别是对于像Python这样的语言,虚拟环境是一个重要的因素,每个虚拟环境都有自己的可执行文件。你当然可以想出一次性检测来检查某些常见位置。对于Windows系统,显然应该检查注册表,因为"py.exe"启动器要求在那里注册解释器,至少是系统范围内的解释器。在Unix机器上,你可以检查常见的bin/文件夹,最突出的是标准位置"/usr/local/bin/",Python安装自身的标准位置。你还可以检查Python可执行文件的PATH路径。但所有这些东西都应该仔细考虑,并只提供初始设置。总会有边缘情况,用户没有做“标准事情”,你的检测将失败。例如,我的Python解释器不在我的PATH路径中,在我访问的Linux服务器上,我已将Python安装到我的主目录下的非标准文件夹中。最后,仅仅因为看起来像Python并不意味着它就是Python。是的,你可以通过猜测来得出一组初始解释器,但真的不要花太多时间在此上面。最终,你无论如何都无法完美地检测所有内容。而且你会错过虚拟环境-这可能是用户在你的IDE中工作的项目非常重要的部分。因此,与其浪费时间在糟糕的检测上,不如花更多时间创建手动对话框以注册解释器,你无论如何都需要它,而一个良好的接口可以使其非常容易-即使对于初学者也是如此。

不太确定这对用户有什么帮助? :) 除了你用相反的方式写了与OP相同的内容。 "Eclipse有这个",而用户写道"我想要Eclipse有的东西"(差不多是这样)。我想你需要写一些如何实现它的示例才能在SO上得分,但我猜一个带有示例的支离破碎的答案会让你扣分,而问题的文本表示会给你加分:P - Torxed
1
@Torxed 这是对 OP 提出的 XY 问题的解决方案,而不是问题的答案(应该如何完成)。 - wnnmaw
2
@Torxed,我没看到OP写了什么类似的话...?而且,“how”不算是一个问题,对吧?我说过要有一个对话框,让用户可以手动添加解释器;这真的不需要太多的工作量,编写IDE的人很容易能够设计出一些良好的界面供用户注册解释器,不是吗? - poke
2
@Aivar 嗯,对于最初的开始,您可以尝试检查一些标准路径(Linux 上的 /usr/local/bin/python;Windows 上的注册表等)并预先注册它们。但是最终,您不可能检测到所有路径。如果我创建一个新的虚拟环境,那本质上只是发生了复制/粘贴。操作系统不可能知道这一点,因此您无法检测到它。所以采用简单而有效的方法,询问用户。 - poke
1
@poke 我认为你走在正确的道路上。我会默认使用路径上的解释器。然后,如果他们想要更改它,他们可以提供他们想要使用的解释器的路径。至于确定它是否为Python,您始终可以调用它并运行一些基本测试。 - Sid
显示剩余3条评论

0

不确定这是否完全可行,但这是一个临时解决方案:

from subprocess import *
from time import sleep

for i in range(2, 4):
    x = Popen('python' + str(i) + ' --version', shell=True, stdout=PIPE, stdin=PIPE, stderr=STDOUT)
    while x.poll() == None:
        sleep(0.025)
    print('Exit code of ' + str(i) + ' is:',x.poll())
    x.stdout.close()
    x.stdin.close()

退出代码将告诉您是否安装了Python2或Python3。 您可以为Python版本2.4、2.4、3.1、3.2等添加第二个迭代器。或者只需将它们保留在列表中,无论您对于这个已经脏乱的修复程序有何偏好。

1
错误的答案。这将无法工作,因为它尝试使用名为“python1”、“python2”等的Python可执行文件名称启动进程。显然,在安装中很少有人会将Python可执行文件命名为这样的名称! - RaviH
@thefourtheye 我正在检查退出代码,print()语句包含了x.poll(),它是退出代码。 - Torxed
@Aivar 我没有运行 which python3.1 的唯一原因是我希望它尽可能跨平台,并且由于 --version 会退出 Python 进程而不会挂起你的应用程序,所以我选择了它 :) 如果你更喜欢使用 which,那么我会接受! - Torxed
@Torxed,没错,我查看了--version。但不幸的是,Windows版Python不使用带有版本号的可执行文件名,似乎我需要深入Win注册表中去了。 - Aivar
或者,如果您知道用户使用默认安装位置,只需迭代 C:\ 即可。或者在 Windows 中使用 dir | find 组合来定位每个 python.exe 进程,因为进入注册表将需要特定于 Windows 的库。再次强调,这仅适用于跨平台,文件夹搜索是跨平台的,注册表不是 :) - Torxed
显示剩余10条评论

0
我建议你查找所有出现的 python.exe。 在Windows中,打开一个命令窗口(按下WIN+R,输入cmd.exe并按下return),然后输入:
dir c:\python.exe /s | find "Directory"

c:\Python310目录 c:\Python310\Lib\venv\scripts\nt目录 c:\Program Files\dotnet\packs\Microsoft.NET.Runtime.Emscripten.3.1.12.Python.win-x64\7.0.9\tools目录 c:\Program Files\dotnet\packs\Microsoft.NET.Runtime.Emscripten.3.1.12.Python.win-x64\7.0.9\tools\Lib\venv\scripts\nt目录 c:\Program Files\PostgreSQL\15\pgAdmin 4\python目录 ...
这个命令会运行一段时间。你会发现它出现在许多地方,甚至是你意想不到的地方。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接