我的 PYTHONPATH 中有一个包,看起来像这样:
package/
__init__.py
module.py
print 'Loading module'
如果我从以下位置运行 Pythonpackage/
目录(或在此目录中写入另一个模块)并输入
import module
它加载 module.py 并按预期打印出“正在加载模块”。但是,如果我然后输入
from package import module
它加载 module.py 并打印“加载模块”again,这是我没想到的。这样做的理由是什么?
注意:我想我从技术上理解为什么Python这样做,因为 sys.modules 键import module
只是"module"
, 但对于from package import module
it's "package.module"
。所以我想我想知道的是为什么这里的键不同——为什么不将文件的路径名用作键,以便 Python 执行这里所期望的操作?
实际上,通过运行来自package
目录,你错误配置了 Python。你不应该把那个目录放在sys.path
,因为它在一个包内。
Python 不使用文件名作为键,因为它不是导入文件,而是导入模块。允许人们做'import c:\jim\my files\projects\code\stuff
'会鼓励各种肮脏的行为。
考虑一下这种情况:如果你在~/foo/package/
and ~/bar
正在PYTHONPATH
- 但 ~/bar 只是一个符号链接~/foo
?您是否希望 Python 能够解析符号链接,然后为您删除重复的符号链接?如果将相对目录放在 PYTHONPATH 上,然后更改目录会怎样?如果“foo.py”是“bar.py”的符号链接怎么办?您是否期望这两者也能被删除重复数据?如果它们不是符号链接,而只是精确的副本怎么办?添加复杂的规则来试图在模棱两可的情况下做一些方便的事情意味着它会做一些对其他人来说非常不方便的事情。 (Python 禅宗 12:面对歧义,拒绝猜测的诱惑。)
Python 在这里做了一些简单的事情,您有责任确保环境设置正确。现在,您可能会说将当前目录放在PYTHONPATH
默认情况下 - 我什至可能同意你的观点 - 但鉴于它存在,它应该遵循与其他路径条目相同的一致规则集。如果打算从任意目录运行,您的应用程序始终可以从中删除当前目录sys.path
从开始sys.path.remove('')
.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)