【问题标题】:Python get path to actual Python executable?Python获取实际Python可执行文件的路径?
【发布时间】:2021-10-13 07:47:09
【问题描述】:

在 Windows 10 上使用 cygwin。当我在 cygwin bash shell 上键入时:

$ python --version
Python 3.8.10

...我知道我拥有的默认 Python 是 3.8。但是,实际的可执行文件是什么 - 或在哪里 - 被调用?这有点难以明确找到;比如说,which 告诉我:

$ which python
/usr/bin/python

...但是如果我仔细观察:

$ ls -la /usr/bin/python*
lrwxrwxrwx 1 user None    24 Oct  1 14:06 /usr/bin/python -> /etc/alternatives/python
lrwxrwxrwx 1 user None    13 Oct  1 14:04 /usr/bin/python2 -> python2.7.exe
-rwxr-xr-x 1 user None  9235 Jan  2  2021 /usr/bin/python2.7.exe
-rwxr-xr-x 1 user None  1685 Jan  2  2021 /usr/bin/python2.7-config
lrwxrwxrwx 1 user None    16 Oct  1 14:05 /usr/bin/python2-config -> python2.7-config
lrwxrwxrwx 1 user None    25 Oct  1 14:06 /usr/bin/python3 -> /etc/alternatives/python3
lrwxrwxrwx 1 user None    14 Oct  1 14:04 /usr/bin/python3.6 -> python3.6m.exe
-rwxr-xr-x 1 user None 10259 May  5 13:22 /usr/bin/python3.6m.exe
-rwxr-xr-x 1 user None  9747 May 20 12:07 /usr/bin/python3.8.exe

所以,/usr/bin/python 实际上是指向/etc/alternatives/python 的符号链接,这是一个带有 XML 内容的小型二进制文件(编辑:错误,见下文);所以它不是 Python 解释器可执行文件。

当然,我现在已经猜到可执行文件很可能是 /usr/bin/python3.8.exe - 但是,我想从 Python 本身明确地得到这个答案。

但是,如果我这样做:

$ python -c 'import sys; print(sys.executable)'
/usr/bin/python

...我再次得到/usr/bin/python 作为答案,这只是指向其他内容的符号链接,因此不是实际的可执行文件。

有没有办法从 Python 本身检索到实际 Python 解释器可执行文件的绝对路径?


编辑:原来/etc/alternatives/python3 是实际解释器的符号链接:

$ ls -al /etc/alternatives/python3
lrwxrwxrwx 1 user None 18 Oct  1 14:06 /etc/alternatives/python3 -> /usr/bin/python3.8

...但是,我仍然想知道 Python 本身是否有办法告诉我这一点。

【问题讨论】:

    标签: python path


    【解决方案1】:

    您应该能够使用 pathlib 解析符号链接,例如:

    import sys
    from pathlib import Path
    
    executable = Path(sys.executable).resolve()
    

    现在,我总是使用 pathlib.Path 对象来处理路径。

    或者,如果您更喜欢旧版 API,您仍然可以使用 os.path,所以

    import os.path
    executable = os.path.realpath(sys.executable)
    

    【讨论】:

      【解决方案2】:

      使用os.path.realpath

      import os
      import sys
      
      print(os.path.realpath(sys.executable))
      

      或者

      python -c 'import sys, os; print(os.path.realpath(sys.executable))'
      

      【讨论】:

        【解决方案3】:

        在 Linux / Unix 上 - 符号链接后面有 readlink 命令。您可以使用 os 模块在 python 中调用它 -

        import os
        cmd_out = os.popen("readlink -f `which python`")
        cmd_out.read()
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2014-09-21
          • 2021-09-10
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多