gpt4 book ai didi

Python模块搜索路径问题

转载 作者:行者123 更新时间:2023-11-28 16:54:52 26 4
gpt4 key购买 nike

我正在尝试在开发环境中工作,但我发现 python 似乎正在使用 site-packages 目录中的模块。我希望它使用我的开发目录中的模块。

sys.path 返回一堆目录,像这样

['', '/usr/lib/python26.zip', '/usr/lib/python2.6', '/usr/lib/python2.6/plat-linux2', '/usr/lib/python2.6/lib-tk', '/usr/lib/python2.6/lib-old', '/usr/lib/python2.6/lib-dynload', '/usr/lib/python2.6/site-packages' etc

这很好,它使用当前目录作为查找的第一个位置(至少我是这样理解的)。

现在,如果我在当前目录中创建一个名为 command.py 的文件,一切都会按照我的预期进行。

>>> import commands
>>> commands.__file__
'commands.pyc'

然后我退出 python shell,并启动另一个 shell。然后我这样做。

>>> import foo.bar.commands

现在,我期望它做的是从当前目录下到 ./foo/bar/并从那里获取命令模块。我得到的是这个

>>> foo.bar.commands.__file__
'/usr/lib/python2.6/site-packages/foo/bar/commands.pyc'

即使在我当前的目录中有一个 ./foo/bar/commands.py

使用 imp.find_module() 和 imp.load_module() 我可以正确加载本地模块。真正有趣的是(虽然我真的不知道它是什么意思)是按此顺序打印的最后一行

>>> import foo.bar.commands
>>> foo.bar.commands.__file__
'/usr/lib/python2.6/site-packages/foo/bar/commands.pyc'
>>> foo.bar.__file__
'/usr/lib/python2.6/site-packages/foo/bar/__int__.pyc'
>>> foo.__file__
'./foo/__init__.pyc'

那么如果它能在本地目录中找到 foo/init.pyc 为什么它不能在本地目录中找到其他文件?

干杯

最佳答案

你提到你当前目录下有一个foo目录,但是你没有告诉我们foo/__init__.py是否存在(甚至可能是空的):如果它不是,这告诉 Python foo 不是一个包。与 foo/bar/__init__.py 类似——如果该文件不存在,即使 foo/__init__.py 存在,那么 foo.bar 不是包。

您可以通过放置 .pth 文件和/或在您的包中显式设置 __path__ 来尝试一下,但基本的简单规则是只放置一个 __init__.py 在您希望 Python 识别为包的每个目录中。该文件的内容是包本身的“主体”,因此如果您 import foo 并且 foo 是一个包含 foo/__init__.py< 的目录 文件,那么这就是您要导入的内容(无论如何,包的主体会在您第一次从包或其任何子包中导入任何内容时执行)。

如果这不是问题所在,那么看起来其他导入(或显式 sys.path 操作)可能会把你搞得一团糟。使用 -v 标志运行 python 会使导入高度可见,这会有所帮助。另一个好方法是放置一个

import pdb; pdb.set_trace()

就在您认为行为不当的导入之前,检查 sys.path、sys.modules(可能还有其他高级结构,例如导入 Hook )——是否已经定义了 sys.modules['foo'] , 例如?以交互方式尝试标准库模块 imp 中的函数,这些函数代表您在给定路径的情况下定位模块,这也可能具有指导意义。

关于Python模块搜索路径问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1523551/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com