想象一下目录结构:
/
a/
__init__.py
b.py
c.py
c.py
档案/a/b.py
看起来:
import c
should_be_absolute = c
所有其他文件(包括__init__
)是空的。
在运行测试脚本时(使用python 2.7):
import a.b
print a.b.should_be_absolute
与PYTHONPATH=/
从空目录(所以没有被添加到PYTHONPATH
从当前目录)我得到
<module 'a.c' from '/a/c.py'>
根据PEP 328和import <> is always absolute
我所期望的陈述:
<module 'c' from '/c.py'>
输出与我删除/a/c.py
文件时的预期一致。
我错过了什么?如果这是正确的行为 - 如何c
从b
(而不是a.c
)导入模块?
根据Pythondev邮件列表这似乎是文档中的一个错误。python27中的默认导入不是绝对的。
发布于 2018-02-27 15:56:21
你需要在Python 2.7上添加from __future__ import absolute_import
或使用importlib.import_module('c')
它是Python 3的默认设置。
Python中存在一个错误:__future__.py
它的文档声明绝对导入在2.7中成为强制性的,但它们没有。
发布于 2018-02-27 16:31:48
如果只是添加/
到PYTHONPATH中,那么搜索顺序仍然可以c
在当前目录中查找。如果你把所有东西都放在一个根包里,并且绝对地提到它会更好:
/myPackage
a/
__init__.py
b.py
c.py
__init__.py
c.py
和PYTHONPATH一样: export PYTHONPATH=/:$PYTHONPATH
所以在a.c
你会做的和这些:
from myPackage import c
from myPackage.c import Foo
import myPackage.c
这样,它总是相对于你的包。
https://stackoverflow.com/questions/-100007444
复制相似问题