使用导入时的ImportError

时间:2017-05-06 11:25:03

标签: python python-import python-sphinx

我的项目有以下布局:

chemcoord/
    __init__.py
    cartesian_coordinates/
        xyz_functions.py
        cartesian_class_main.py
        ...
    ...
docs/
    sources/
        conf.py
        cartesian_coordinates.rst
        src_xyz_function1/
            chemcoord.cartesian_coordinates.xyz_functions.view.rst
            ...
        ...
    ...

我的软件包有一个setup.py脚本,通过pip install -e安装,可在PYTHONPATH中找到。不过我也说: sys.path.insert(0, os.path.abspath(u'../../'))进入Sphinx conf.py文件。

__init__.py我导入:

from chemcoord.cartesian_coordinates.cartesian_class_main import Cartesian
from chemcoord.cartesian_coordinates import xyz_functions
# the import of pew is just for testing purposes
from chemcoord.cartesian_coordinates import xyz_functions as pew

xyz_functions.py中的一个函数被称为例如view。 如果我在Ipython控制台中执行此操作,则会定义所有函数:

 import chemcoord as cc
 cc.cartesian_coordinates.xyz_functions.view
 cc.xyz_functions.view
 cc.pew.view

cartesian_coordinates.rst文件中的以下sphinx代码应记录Cartesianxyz_functions

Cartesian coordinates
===================================



.. currentmodule:: chemcoord


The ``Cartesian`` class which is used to represent
a molecule in cartesian coordinates.

.. autosummary::
    :toctree: src_Cartesian

    ~Cartesian



A collection of functions operating on instances of ``Cartesian``.

.. currentmodule:: chemcoord.cartesian_coordinates.xyz_functions

.. autosummary::
    :toctree: src_xyz_functions1

    ~isclose
    ~read
    ~write
    ~view


A collection of functions operating on instances of ``Cartesian``.

.. currentmodule:: chemcoord

.. autosummary::
    :toctree: src_xyz_functions2

    ~xyz_functions.isclose
    ~xyz_functions.read
    ~xyz_functions.write
    ~xyz_functions.view


A collection of functions operating on instances of ``Cartesian``.

.. currentmodule:: chemcoord

.. autosummary::
    :toctree: src_xyz_functions3

    ~pew.isclose
    ~pew.read
    ~pew.write
    ~pew.view

我通过rst生成存档sphinx-autogen文件,它们看起来像:

chemcoord.cartesian_coordinates.xyz_functions.view
==================================================

.. currentmodule:: chemcoord.cartesian_coordinates.xyz_functions

.. autofunction:: view

现在真的很奇怪的是,那 记录了chemcoord.cartesian_coordinates.xyz_functionschemcoord.Cartesian的部分,但我得到了文档部分的ImportError: chemcoord.xyz_functionschemcoord.pew并且没有记录。存根rst文件在所有情况下均由sphinx-autogen创建。 有没有人有一个想法如何解决这个问题?

最终用户的预期用途是:

 import chemcoord as cc
 cc.xyz_functions.view(...)

出于这个原因,我想在xyz_functions的命名空间中使用chemcoord进行记录。

编辑1(因为@LaurentLaport的答案而澄清):

另外,如果我在cartesian_coordinates.rst文件中写下以下内容,它仍然不起作用:

Cartesian coordinates
===================================



.. currentmodule:: chemcoord


The ``Cartesian`` class which is used to represent
a molecule in cartesian coordinates.

.. autosummary::
    :toctree: src_Cartesian

    ~Cartesian



A collection of functions operating on instances of ``Cartesian``.

.. currentmodule:: chemcoord

.. autosummary::
    :toctree: src_xyz_functions2

    ~xyz_functions.isclose
    ~xyz_functions.read
    ~xyz_functions.write
    ~xyz_functions.view

1 个答案:

答案 0 :(得分:0)

我在sphinx网页上创建了一个问题,他们给了我一个有效的解决方案。如果它是一个干净的解决方案,我仍然不确定。

诀窍是用__init__.py文件中的以下行伪造模块系统:

import sys
sys.modules['chemcoord.xyz_functions'] = xyz_functions

解释是straightforward

模块import Y中的

X使Y成为X模块的属性。这并不意味着将Y转换为X.Y模块。 另一方面,import X.Y尝试加载X.Y模块,而不是Y模块的X属性。 结果,它无法导入。