如何以编程方式获取python.exe的位置?

250

基本上,我想掌握Python解释器,以便可以将一个脚本文件传递给它执行(来自外部应用程序)。


4
这个问题是如何成为另一个问题的重复,而这个问题是在那个问题之前一年提出的?它应该是相反的情况。请问该怎么解决? - mhawke
@mhawke 另一个帖子的浏览量比这个多,措辞也更好。因此我将其反向复制。说实话,它们两个都表达了同样的意思,所以我们甚至可以标记为合并。 - Bhargav Rao
3
@BhargavRao:是的,它写得更好,标题可能对此起了作用。此外,被接受的答案更好,并且(现在)包括对文档的链接,因此总体而言我认为你是正确的。 - mhawke
3个回答

410

这适用于Linux和Windows:

Python 3.x

>>> import sys
>>> print(sys.executable)
C:\path\to\python.exe

Python 2.x

>>> import sys
>>> print sys.executable
/usr/bin/python

3
是的 - >>> 导入sys | >>> 打印sys.executable | C:\ Python25 \ pythonw.exe - Smashery
4
我认为在一个经过py2exe编译的应用程序中,它将指向该应用程序的可执行文件,而不是python.exe。 尽管如此,仍需要有人进行确认。 - FogleBird
1
只有在你已经运行 Python 解释器时,这才有意义。我想他试图从 Python 外部找到位置。 - John Montgomery
6
“programmatically” 的意思是从 Python 解释器内部实现。至少对我来说,当我搜索这个答案时是这个意思 :) - GreenAsJade
1
如下所述,这在某些环境下不起作用,例如如果您安装了多个Python版本。显然,您想要使用当前正在使用的Python版本。 - Andy Hayden
显示剩余4条评论

63

如果在嵌入式Python环境中工作,sys.executable是不可靠的。我建议从中推断出它

import os
os.__file__

11
py_interpreter = os.path.join(os.file.split("lib/")[0],"bin","python"))这行代码的功能是将Python解释器的路径保存到变量py_interpreter中。具体来说,它使用os模块获取了Python标准库所在的路径,并且从该路径中分离出了"bin/python"子目录的路径,然后将两者拼接起来得到了完整的Python解释器路径,并将其保存在py_interpreter变量中。 - melMass
7
也许更好的写法是 pathlib.Path(os.__file__).parents[2] / 'bin' / 'python' - rth
4
为什么在嵌入式Python环境中它不可靠?当文档中提到“有意义”的系统时,是否指的是相反情况? - MrD
1
由于符号链接/硬链接,@rth os.__file__在虚拟环境中无法正常工作;它将返回基本环境的路径,因此可能需要一个if语句来首先检查sys.executable,如果它不以"python"结尾,则回退到os.__file__ - cowbert
2
我能够利用sys.base_prefixsys.prefix分别为基本Python安装和虚拟环境提供帮助。 这很方便,因为我已经在导入sys。 更多信息,请查看文档 - David Thompson
显示剩余3条评论

3

我认为这取决于您如何安装Python。请注意,您可以在计算机上安装多个版本的Python,就像我一样。但是,如果您通过Python 2.2或更高版本的msi安装程序进行安装,则会创建一个类似以下的注册表键:

HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\App Paths\Python.exe

在我的机器上,这个值是:

C:\Python25\Python.exe

您只需读取注册表键以获取位置。

但是,您可以通过类似于xcopy的模型安装Python,可以将其安装在任意位置,并且您只需要知道它安装在哪里即可。


如果它在应用程序路径中,你甚至不需要知道它的位置,对吧? ;) - Gleb
18
查看注册表并没有太大的用处,因为您不知道正在运行的Python是否与注册表中所述的相同。 - GreenAsJade

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