找不到模块,但只能在ipython3中找到

时间:2017-07-12 11:36:24

标签: python python-3.x ipython

我编写了一个名为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执行完全相同的过程时,没有错误消息。

谢谢

1 个答案:

答案 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>语法导入的内容。

进一步阅读