交互式Python - 相对导入的解决方案

and*_*rew 5 python ipython python-2.7 jupyter-notebook

来自Python 的十亿次相对导入

  • 为了使from .. import模块正常工作,模块名称的点数必须至少与语句中的点数一样多import
  • ...如果您以交互方式运行解释器...该交互式会话的名称是__main__
  • 因此,您不能直接从交互式会话中进行相对导入

我喜欢在编写生产代码之前使用交互式 Jupyter Notebook 会话来探索数据和测试模块。为了让事情变得清晰易懂,让队友可以理解,我喜欢将笔记本放在一个interactive包中,与我正在测试的包和模块并排放置。

package/

    __init__.py

    subpackage1/

        __init__.py

        moduleX.py

        moduleY.py

        moduleZ.py

    subpackage2/

        __init__.py

        moduleZ.py

    interactive/
        __init__.py
        my_notebook.ipynb
Run Code Online (Sandbox Code Playgroud)

在交互式会话期间interactive.my_notebook.ipynb,您将如何导入其他模块,例如subpackage1.moduleXsubpackage2.moduleZ

and*_*rew 4

我当前使用的解决方案是将父包附加到sys.path.

import sys
sys.path.append("/Users/.../package/")

import subpackage1.moduleX
import subpackage2.moduleZ
Run Code Online (Sandbox Code Playgroud)