我编写了一个名为biographs
的软件包,其架构如下:
biographs (folder)
>biographs (package)
>__init__.py
>bpdb.py
>pmolecule.py
>bgraph.py
>bspace.py
__init__.py
文件仅限以下内容:
from .pmolecule import Pmolecule
当我在ipython3中工作并且我想导入biographs
(仅使用类Pmolecule
)时,我在ipython3中遇到以下错误(Ipython 6.0.0,Python 3.6.1) ):
In [1]: cd ~/biographs/
/Users/rdora/biographs
In [2]: import biographs
---------------------------------------------------------------------------
ModuleNotFoundError Traceback (most recent call last)
<ipython-input-2-1803e6928e0e> in <module>()
----> 1 import biographs
/Users/rdora/biographs/biographs/__init__.py in <module>()
----> 1 from .pmolecule import Pmolecule
/Users/rdora/biographs/biographs/pmolecule.py in <module>()
1 # class to deal with protein structures
2 # python 2
----> 3 import bpdb
4 import bgraph
5 import bspace
ModuleNotFoundError: No module named 'bpdb'
然而当我使用IPython 5.3.0和Python 2.7.13执行完全相同的过程时,没有错误消息。
谢谢
答案 0 :(得分:2)
这是因为导入在Python 2和Python 3中的工作原理。在您的模块pmolecule.py
中,您显然会import bpdb
。在Python 2中,这将在本地目录中搜索名为bpdb.py
的模块并将其导入。但是在Python 3中你必须明确这些相对导入,即你需要做
from . import bpdb
为了获得Python 2的一致性,您可以使用from __future__ import absolute_imports
来禁止在Python 2下进行此类非显式导入。
请注意,同样适用于:
----> 3 import bpdb
4 import bgraph
5 import bspace
需要通过from . import <module-name>
语法导入的内容。