例如。我有一个包foo
,它有一个名为foo.py
/home/user/tmp/testPath/
|-- foo
| |-- bar.py
| |-- foo.py
| |-- __init__.py
| `-- module.py
`-- test_package.py
如何在bar.py
中使用绝对导入来导入module.py
?我尝试了from foo import module
和import foo.module
,但它始终认为是foo is from foo.py
或者我应该总是避免使用与包名相同的名称模块文件名?
foo.py
print 'you are in foo.py'
import foo
print 'foo', foo
bar.py
print 'you are in bar.py'
import foo
print 'foo from bar', foo
from foo import module
# import foo.module
test_package.py
import sys
sys.path.insert(0, '/home/user/tmp/testPath')
import foo.bar
但错误信息是
you are in bar.py
you are in foo.py
foo <module 'foo.foo' from '/home/user/tmp/testPath/foo/foo.py'>
foo from bar <module 'foo.foo' from '/home/user/tmp/testPath/foo/foo.py'>
Traceback (most recent call last):
File "/home/user/tmp/testPath/test_package.py", line 5, in <module>
import foo.bar
File "/home/user/tmp/testPath/foo/bar.py", line 8, in <module>
from foo import module
ImportError: cannot import name module
答案 0 :(得分:1)
在python 2中,你必须启用py3风格的导入。
bar.py:
from __future__ import absolute_import
from foo import module
在python 3中,一切都应该是正常的,但未来的导入将无效(即不会破坏代码)。
这是官方记录和推荐的方式。建议在项目的每个文件中进行此类导入(以及其他几个),以防万一 - 从一开始就使其与py3更兼容。