【问题标题】:How do I import with absolute path in python packages with same name module?如何在具有同名模块的python包中使用绝对路径导入?
【发布时间】:2017-10-02 22:21:19
【问题描述】:

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

【问题讨论】:

    标签: python package pep


    【解决方案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/

    【讨论】:

      猜你喜欢
      • 2020-10-27
      • 1970-01-01
      • 1970-01-01
      • 2014-06-25
      • 2012-08-27
      • 2014-05-02
      • 1970-01-01
      • 2014-05-31
      • 2021-03-10
      相关资源
      最近更新 更多