我的项目有以下布局:
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代码应记录Cartesian
和xyz_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_functions
和chemcoord.Cartesian
的部分,但我得到了文档部分的ImportError:
chemcoord.xyz_functions
和chemcoord.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
答案 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
属性。
结果,它无法导入。