【问题标题】:PYTHONPATH ignoredPYTHONPATH 被忽略
【发布时间】:2010-11-03 08:44:08
【问题描述】:

环境:debian 4.0

Python 2.4

我的“项目”安装在:

/usr/lib/python2.4/site-packages/project。

但我想使用我的工作副本,而不是位于以下位置的已安装副本:

/home/me/dev/project/src

所以我要做的是:

导出 PYTHONPATH=/home/me/dev/project/src

ipython

import foo # 在 src 中

foo.__file__

*/usr/lib/python2.4/site-packages/project/foo.py*

而不是:

/home/me/dev/project/src/project/foo.py

怎么会?我尝试检查路径(已完成上面的导出),我看到的是:

导入系统,操作系统

系统路径

['', '/usr/bin', '/usr/lib/python2.4/site-packages', '/home/me/dev/project/src', '/usr/lib/python24.zip', '/usr/lib/python2.4', '/usr/lib/python2.4/plat-linux2', '/usr/lib/python2.4/lib-tk', '/usr/lib/python2.4/lib-dynload', '/usr/local/lib/python2.4/site-packages', '/usr/lib/python2.4/site-packages/PIL', '/var/lib/python-support/python2.4', '/usr/lib/python2.4/site-packages/IPython/Extensions', '/home/me/.ipython']

os.environ['PYTHONPATH']

/home/me/dev/project/src

【问题讨论】:

  • 机器正常工作:> export PYTHONPATH=foo > ipython > import sys > sys.path = [ '/etc/python2.4', '/home/me/foo', ' /usr/lib/python24.zip'、'/usr/lib/python2.4'、'/usr/lib/python2.4/plat-linux2'、'/usr/lib/python2.4/lib-tk' , '/usr/lib/python2.4/lib-dynload', '/usr/local/lib/python2.4/site-packages', '/usr/lib/python2.4/site-packages', '/ var/lib/python-support/python2.4', ] 在无法正常工作的机器中,/usr/lib/python2.4/site-packages 在列表中排在前面。 ..
  • 让我们提出一些精确的问题:每个人都同意,如果我将 PYTHONPATH 设置为有效的模块路径,无论如何它都应该首先加载这个模块?每个人都同意 python 尝试按照 sys.path 的顺序加载模块?如果 aboce 是正确的,为什么 python 不在 sys.path 的开头(在鸡蛋之后)插入 PYTHONPATH?

标签: python path debian


【解决方案1】:

根据 python 文档,这是预期行为https://docs.python.org/2.4/lib/module-sys.html:

注意脚本目录是 插入的条目之前插入 作为 PYTHONPATH 的结果。

在 python-2.6 下是不同的:http://docs.python.org/tutorial/modules.html#the-module-search-path

【讨论】:

  • 我对鸡蛋很好。 :) 但是为什么 '/usr/lib/python2.4/site-packages' 出现在我的 python 路径之前?如何在不更改 python 文件中的 sys.path 的情况下强制 PYTHONPATH 比“/usr/lib/python2.4/site-packages”具有更高的优先级?
  • @van。我不明白。我将 PYTHONPATH 设置为正确的值,它首先加载站点包中的内容。奇怪!
  • 要更改优先级,请勿运行位于站点包中的脚本。将脚本移动到其他任何地方,脚本的目录(站点包)将不再弄乱您的预期搜索。
  • 脚本目录?我正在导入一个位于 site-packages/project/foo.py 和 /home/me/dev/project/src/project/foo.py 中的模块。为了解决这个问题,假设我希望能够使用 ipython 运行它。
  • @joseph。查看我提供的链接:对于 python-2.4,它实际上是定义的行为。从那时起它就改变了。
【解决方案2】:

我发现了问题(我很早就错过了有人将我指向Where is Python's sys.path initialized from?)。

easy_install 似乎创建了一个 pth 文件 /usr/lib/python2.4/site-packages/easy-install.pth,然后由 site.py 加载。这会将站点包路径插入到 PYTHONPATH 之前的 sys 路径中。不好看。

【讨论】:

    【解决方案3】:

    我认为您无法控制 PYTHONPATH 插入实际路径列表的位置。但这不是修改路径的唯一方法 - 您可以在尝试导入项目之前自己更新 sys.path。

    编辑:在您的具体情况下,您可以修改路径

    import sys
    sys.path.insert(2, '/home/me/dev/project/src')
    

    【讨论】:

    • 所以我不能强制 python 在哪里寻找模块?
    • 这对我使用 ipython notebook 有效,而在命令 shell 中设置 PYTHONPATH 却没有。谢谢。
    【解决方案4】:

    我在“/home/me/dev/project/src”之前的路径中看到“/usr/lib/python2.4/site-packages”,这有关系吗?当你切换两者时会发生什么?

    来自文档:

    如果未设置 PYTHONPATH,或者在此处找不到文件,则在依赖于安装的默认路径中继续搜索

    所以也许您没有像您想象的那样在 PYTHONPATH 上找到您的工作副本?

    【讨论】:

    • 我觉得John是对的,Python会使用sys.path中索引最低的模块
    • 是的,这很重要。 PYTHON,AFAIK,应该先插入 PYTHONPATH(或者就在 '.' 之后)我的 PYTHONPATH 是正确的。
    • 但是如果你犯了一个错误,比如省略了 /home/me/dev/project/src 中的 init.py 文件,那么 python 会继续在 site-packages 中找到 prod 包
    • __init__.py 在那里(/home/me/dev/project/src 中)
    • 您是否尝试过交换我建议的 sys.path 中的两项?
    【解决方案5】:

    不是直接回答您的问题,但您也可以使用virtualenv 创建开发环境。然后,您可以在该 virtualenv 中将您的产品作为开发包安装在 /home/me/dev/project/src 中:“python setup.py develop”。

    这样您就不必手动更改您的PYTHONPATH。如果您想使用开发代码,只需激活 virtualenv。

    【讨论】:

    • 这仅适用于您的项目有setup.py,OP 不保证这一点...
    • 你是对的,我假设有一个setup.py,因为 OP 声明他“安装”了该项目。
    【解决方案6】:

    我认为您将 PYTHONPATH 设置为 /home/me/build/project/src 因为 /home/me/dev/project/src 没有出现在 sys.path 中,但 /home/me/build/project/src可以。

    【讨论】:

    • 谢谢大卫。 sys.path 确实包含 /home/me/dev/project/src 而不是 /home/me/build/project/src (因为我已经重命名了其中一些内容有误)。问题依然存在。
    【解决方案7】:

    听起来src 目录没有__init__.py 文件。这不是一个合适的包。

    【讨论】:

    • 如您在上面看到的,有一个。
    • @S.lott 抱歉。我说的是“init.py`在那里(在/home/me/dev/project/src中)”
    猜你喜欢
    • 1970-01-01
    • 2018-10-11
    • 2012-08-07
    • 1970-01-01
    • 1970-01-01
    • 2016-09-26
    • 2016-06-05
    • 2014-02-25
    • 2011-05-09
    相关资源
    最近更新 更多