如何在具有相同名称模块的python包中使用绝对路径导入?

时间:2017-10-02 22:21:19

标签: python package pep

例如。我有一个包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 moduleimport 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

1 个答案:

答案 0 :(得分:1)

在python 2中,你必须启用py3风格的导入。

bar.py:

from __future__ import absolute_import
from foo import module

在python 3中,一切都应该是正常的,但未来的导入将无效(即不会破坏代码)。

这是官方记录和推荐的方式。建议在项目的每个文件中进行此类导入(以及其他几个),以防万一 - 从一开始就使其与py3更兼容。

另请参阅:https://www.python.org/dev/peps/pep-0328/