什么用Python设置sys.path,何时设置?


74

当我跑步时

import sys 
print sys.path

在Mac上(Mac OS X 10.6.5,Python 2.6.1),我得到以下结果。

/Library/Python/2.6/site-packages/ply-3.3-py2.6.egg
...
/Library/Python/2.6/site-packages/ipython-0.10.1-py2.6.egg
/System/Library/Frameworks/Python.framework/Versions/2.6/lib/python26.zip
/System/Library/Frameworks/Python.framework/Versions/2.6/lib/python2.6
/System/Library/Frameworks/Python.framework/Versions/2.6/lib/python2.6/plat-darwin
/System/Library/Frameworks/Python.framework/Versions/2.6/lib/python2.6/plat-mac
/System/Library/Frameworks/Python.framework/Versions/2.6/lib/python2.6/plat-mac/lib-scriptpackages

/System/Library/Frameworks/Python.framework/Versions/2.6/Extras/lib/python
/System/Library/Frameworks/Python.framework/Versions/2.6/lib/python2.6/lib-tk
/System/Library/Frameworks/Python.framework/Versions/2.6/lib/python2.6/lib-old
/System/Library/Frameworks/Python.framework/Versions/2.6/lib/python2.6/lib-dynload
/Library/Python/2.6/site-packages
/System/Library/Frameworks/Python.framework/Versions/2.6/Extras/lib/python/PyObjC
/System/Library/Frameworks/Python.framework/Versions/2.6/Extras/lib/python/wx-2.8-mac-unicode

它们分为5类。

  • /Library/Python/2.6/site-packages/*.egg
  • /Library/Python/2.6/site-packages
  • 框架/Python.framework/版本/2.6/lib/python2.6
  • 框架/Python.framework/版本/2.6/Extras/lib/python
  • 来自PYTHONPATH环境变量的PATH。

我可以使用代码添加更多路径

sys.path.insert(0, MORE_PATH)
  • 什么例程设置这些路径,何时设置?
  • 是否有些路径是在python源代码中构建的?
  • 插入'sys.path.insert'的路径是否有可能被忽略?我对此感到很好奇,就像使用mod_wsgi一样,我发现使用sys.path.insert找不到路径。我问了另一个帖子这个问题。

添加

根据迈克尔的回答,我查看了site.py,并获得了以下代码。

def addsitepackages(known_paths):
    """Add site-packages (and possibly site-python) to sys.path"""
    sitedirs = []
    seen = []

    for prefix in PREFIXES:
        if not prefix or prefix in seen:
            continue
        seen.append(prefix)

        if sys.platform in ('os2emx', 'riscos'):
            sitedirs.append(os.path.join(prefix, "Lib", "site-packages"))
        elif sys.platform == 'darwin' and prefix == sys.prefix:
            sitedirs.append(os.path.join("/Library/Python", sys.version[:3], "site-packages"))

我还认为,具有site.py的目录名称(对于我的Mac是/System/Library/Frameworks/Python.framework/Versions/2.6/lib/python2.6)应该内置到Python源代码中。


2
它的一部分可以用Python的sys.path值来回答吗?
wkl

如果您仍在尝试找出您先前的问题-问题很可能出在启动文件中,而不是与网站导入有关。对于软件包来说,删除它们没有新内容的路径将是极其糟糕的做法。
nate c

为什么seen没有一套?:P
Mr_and_Mrs_D

我在同一问题上找到的最佳答案可以在此处找到,这是对另一个SO问题的答案的链接。
迈克威廉姆森

Answers:


30

大部分内容都是在Python中设置的site.py,启动解释器时会自动将其导入(除非您使用-S选项启动它)。初始化期间在解释器中很少设置路径(您可以通过使用来启动python找出哪个路径-S)。

另外,某些框架(例如我认为的Django)sys.path在启动时会进行修改以满足其要求。

site模块有一个很好的文档,带有注释的源代码,并且如果您通过来运行它,则会打印出一些信息python -m site


显然在Debian及其衍生版本中,/usr/local/lib/python<version>/dist-packages/usr/{lib,share}/python<version>/dist-packages中的目录会自动添加到路径中(根据/usr/lib/python2.7/site.pyUbuntu 14.04)。
z0r

15

通过学习Python

sys.path是模块搜索路径。Python在程序启动时对其进行配置,自动合并顶级文件的主目录(或空字符串以指定当前的工作目录),任何PYTHONPATH目录,所创建的任何.pth文件路径的内容以及标准库目录。结果是目录名称字符串的列表,Python在每次导入新文件时都会对其进行搜索。


6

site.py确实是答案。我想删除对Mac默认安装的旧Python的任何依赖。效果很好,因为每次启动python解释器时都会调用“ site.py”。

对于Mac,我在/System/Library/Frameworks/Python.framework/Versions/2.7/Extras/lib/python/site.py的main()末尾手动添加了以下行:

    sys.path =  filter (lambda a: not a.startswith('/System'), sys.path)

请记住,在运行Python时,site.py可以通过使用命令行-S选项阻止运行。From docs禁止导入模块site及其相关的依赖于站点的操作sys.path
Piotr Dobrogost '16

4

路径包含以下部分:

  • 具有您的系统库的OS路径
  • 当前目录python从开始
  • 环境变量 $PYTHONPATH
  • 您可以在运行时添加路径。

路径不会被忽略。但是,可能找不到它们,并且不会引发错误。sys.path也应该只添加,而不要减去。Django不会删除路径。


1

添加到已接受的答案中,并解决说模块不应从sys.path以下项中删除条目的注释:

大致上是这样,但是在某些情况下,您可能希望sys.path通过删除条目进行修改。例如-这是Mac专用的;* nix / Windows推论可能存在-如果您创建Python.framework要包含在自己的项目中的自定义sys.path项,则可能要忽略指向系统的默认条目Python.framework

您有两种选择:

  1. 破解site.py,如@damirv指示,或

  2. 将您自己的sitecustomize模块(或程序包)添加到实现相同最终结果的自定义框架中。如site.py注释中所示(对于2.7.6,无论如何):

    经过这些路径操作后,将尝试导入名为sitecustomize的模块,该模块可以执行任意其他特定于站点的自定义。如果此导入失败,并带有ImportError异常,则将忽略它。


1

另请注意:如果PYTHONHOME设置了env var,则会从此路径而非标准文档中加载默认库。

这不是问题的直接答案,而是我刚刚发现的原因,导致加载了错误的标准库,并且我的搜索将我带到了这里。


PYTHONHOME实际上不适用于mod_wsgi,因为Apache不会从用户环境启动,而root用户是从系统单元脚本启动的,因此不会设置它。
Graham Dumpleton '16

1
@GrahamDumpleton也许可以,但是在更一般的情况下,问题的标题可能会导致其他问题。我只是希望这些信息可以对某人有所帮助。
吉莉,2013年

1

您正在使用系统python /usr/bin/python

sys.path是在python启动时从系统文件设置的。

不要触摸那些文件,尤其是site.py,因为这可能会扰乱系统。

但是,您可以在python中更改sys.path,特别是在启动时:

在〜/ .bashrc或〜/ .zshrc中:

export PYTHONSTARTUP=~/.pythonrc

在〜/ .pythonrc中:

将您的更改写入sys.path。

这些更改仅适用于交互式shell。

为了使系统遭受黑客攻击的风险很小,请安装您自己的和最新的python版本。


您如何知道“您正在使用系统python / usr / bin / python。”?
Acton
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.