【问题标题】:How do I find out my PYTHONPATH using Python?如何使用 Python 找出我的 PYTHONPATH?
【发布时间】:2010-12-02 03:42:43
【问题描述】:

如何从 Python 脚本(或交互式 shell)中找出系统的 PYTHONPATH 变量中列出了哪些目录?

【问题讨论】:

  • 我不确定你想做什么,但如果你想知道哪些文件夹用于搜索正在导入的模块,你不应该依赖PYTHONPATH。为此使用sys.path
  • 通过简单的实验,我发现下面 Vanuan 的答案(打印 sys.path)只是打印 PYTHONPATH。这在我们使用添加到 PYTHONPATH 的 add_path(new_path) 更改值后起作用。
  • 这篇文章的标题和正文提出了两个不同的问题。 sys.path 是“指定模块搜索路径的字符串列表” - docs.python.org/2/library/sys.html#sys.path。 PYTHONPATH 是一个影响此列表的环境变量。根据任何合理的定义,sys.path 是您的“python 路径”。
  • 别忘了python -m site

标签: python python-module pythonpath


【解决方案1】:

你可能也想要这个:

import sys
print(sys.path)

或者作为一个从码头出发的班轮:

python -c "import sys; print('\n'.join(sys.path))"

警告:如果您安装了多个 Python 版本,您应该使用相应的命令 python2python3

【讨论】:

  • 相同。 Linux aaa.com 2.6.18-4-686-bigmem #1 SMP Wed Jun 6 09:41:07 UTC 2007 i686 GNU/Linux ... Debian Sarge
  • 这是获取当前运行时 python 路径的平台和环境无关的方式。
  • 这个答案对我的情况比接受的答案更有帮助。我知道我的环境变量是什么。除了我的环境变量,我需要知道 python 决定指向的位置。
  • 对于 Python 3:python -c "import sys; print('\n'.join(sys.path))"
  • @mirceamironenco 已更改
【解决方案2】:

sys.path 可能包含不在您的PYTHONPATH 环境变量中的项目。要直接查询变量,请使用:

import os
try:
    user_paths = os.environ['PYTHONPATH'].split(os.pathsep)
except KeyError:
    user_paths = []

【讨论】:

  • (或者,更一般地说 ...split(os.sep) )。无法弄清楚为什么你没有得到爱,马克。从技术上讲,您的回复比 Paul D Waite 自己对他的问题的回复更准确????
  • 分隔符的问题可能是我没有得到爱的原因。谢谢你让我直截了当。
  • 如果收到 KeyError,是否意味着我的系统中没有定义 PYTHONPATH?那是问题吗?谢谢
  • @glarrin,正确 - KeyError 表示未定义 PYTHONPATH。不会有问题,因为已经设置了默认路径,请参阅sys.path
【解决方案3】:

似乎无法编辑其他答案。有一个小错误,因为它是仅限 Windows 的。更通用的解决方案是使用 os.sep,如下所示:

sys.path 可能包含不在您的 PYTHONPATH 环境变量中的项目。要直接查询变量,请使用:

import os
os.environ['PYTHONPATH'].split(os.pathsep)

【讨论】:

  • 对于未来的读者:os.sep 返回操作系统的目录分隔符,例如/。 Python路径中使用的分隔符不同,由os.pathsep返回,如接受的答案所示。
【解决方案4】:

PYTHONPATH 是一个环境变量,其值为目录列表。设置后,Python 将使用它来搜索导入的模块以及其他标准。和 Python 的“sys.path”中列出的第 3 方库目录。

与任何其他环境变量一样,您可以将其导出到 shell 或 ~/.bashrc 中,请参阅 here。 您可以在 Python 中查询 os.environ['PYTHONPATH'] 的值,如下所示:

$ python3 -c "import os, sys; print(os.environ['PYTHONPATH']); print(sys.path) if 'PYTHONPATH' in sorted(os.environ) else print('PYTHONPATH is not defined')"

如果在 shell 中定义为

$ export PYTHONPATH=$HOME/Documents/DjangoTutorial/mysite

那么结果 =>

/home/Documents/DjangoTutorial/mysite
['', '/home/Documents/DjangoTutorial/mysite', '/usr/local/lib/python37.zip', '/usr/local/lib/python3.7', '/usr/local/lib/python3.7/lib-dynload', '/usr/local/lib/python3.7/site-packages']

ELSE 结果 =>

PYTHONPATH is not defined

要将 PYTHONPATH 设置为多个路径,请参阅 here

请注意,可以在运行时通过 sys.path.insert()、del 或 remove() 添加或删除搜索路径,但不能通过 os.environ[]。 示例:

>>> os.environ['PYTHONPATH']="$HOME/Documents/DjangoTutorial/mysite"
>>> 'PYTHONPATH' in sorted(os.environ)
True
>>> sys.path // but Not there
['', '/usr/local/lib/python37.zip', '/usr/local/lib/python3.7', '/usr/local/lib/python3.7/lib-dynload', '/usr/local/lib/python3.7/site-packages']

>>> sys.path.insert(0,os.environ['PYTHONPATH'])
>>> sys.path // It's there
['$HOME/Documents/DjangoTutorial/mysite', '', '/usr/local/lib/python37.zip', '/usr/local/lib/python3.7', '/usr/local/lib/python3.7/lib-dynload', '/usr/local/lib/python3.7/site-packages']
>>> 

总之,PYTHONPATH 是在 sys.path 中为导入的模块指定 Python 搜索路径的一种方式。您还可以在没有 PYTHONPATH 的帮助下直接将列表操作应用于 sys.path。

【讨论】:

    【解决方案5】:

    在 Windows 10 中工作,与 vanuan 的答案基本相同,但更干净(从某个地方拍摄,不记得在哪里......):

    import sys
    for p in sys.path:
        print(p)
    

    【讨论】:

      【解决方案6】:

      当 Python 给我一条错误消息时,它会告诉我它在哪里 :)

      >>> import os
      >>> os.environ['PYTHONPATH'].split(os.pathsep)
      Traceback (most recent call last):
        File "<stdin>", line 1, in <module>
        File "C:\Users\martin\AppData\Local\Programs\Python\Python36-32\lib\os.py", line 669, in __getitem__
          raise KeyError(key) from None
      KeyError: 'PYTHONPATH'
      >>>
      

      【讨论】:

        【解决方案7】:
        import subprocess
        python_path = subprocess.check_output("which python", shell=True).strip()
        python_path = python_path.decode('utf-8')
        

        【讨论】:

          【解决方案8】:

          如果使用 conda,您可以使用 os.environ["CONDA_PREFIX"] 获取 env 前缀。

          【讨论】:

            【解决方案9】:
            import sys
            for a in sys.path:
                a.replace('\\\\','\\')
                print(a)
            

            它将提供所有准备好放置在 Windows 中的路径。

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2011-03-16
              • 2021-04-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多