python - 导入如何在 IPython 中工作

标签 python ipython relative-path python-packaging

我对 import 语句在 IPython 中的工作方式感到有些困惑。我通过网络搜索一无所获。

隐式相对导入适用于 Python 2,但我不知道 IPython for Python 3 是否仍然如此。

使用点语法的相对导入似乎根本不起作用:

In [6]: ls 
dsp/  __init__.py  __init__.pyc  utils/

In [7]: from .utils import capture
---------------------------------------------------------------------------
ValueError                                Traceback (most recent call last)
<ipython-input-7-e7d50007bdd1> in <module>()
----> 1 from .utils import capture

ValueError: Attempted relative import in non-package

导入使用点语法的模块似乎是不可能的:
In [8]: cd utils
/home/user/workspace/mypkg/mypkg/utils

In [9]: ls
capture/  capture.py  capture.pyc  cext/  __init__.py  __init__.pyc

In [10]: from capture import Capture
---------------------------------------------------------------------------
ValueError                                Traceback (most recent call last)
<ipython-input-10-8c31c76d052d> in <module>()
----> 1 from capture import Capture

/home/user/workspace/mypkg/mypkg/utils/capture.py in <module>()
     17 import tarfile
     18 import re
---> 19 from .. import utils
     20 from . import flprint
     21 from select import poll

ValueError: Attempted relative import in non-package

在某处是否有一些简明的文档?

最佳答案

问题是我从包层次结构中的较低位置导入模块,而不是在模块的导入语句中使用。所以如果我 cd 进入 utils 目录并运行

from capture import Capture

然后捕获成为层次结构的顶层。所以捕获模块中的import语句
from .. import utils

超越了顶层。 Python 不知道“..”指的是什么,因为模块不知道它们属于哪个包。如果我更改回 mypkg 目录,我会遇到同样的问题
In [13]: cd ..
/home/user/workspace/myproj/mypkg

In [14]: from utils import capture
---------------------------------------------------------------------------
ValueError                                Traceback (most recent call last)
<ipython-input-14-c87f26b2171d> in <module>()
----> 1 from utils import capture

/home/user/workspace/myproj/mypkg/utils/capture.py in <module>()
    18 import re
    19 import zmq
---> 20 from .. import utils
    21 from . import flprint
    22 from select import poll

ValueError: Attempted relative import beyond toplevel package

在这种情况下, utils 是顶层,所以
from . import flprint

会工作,但是
from .. import utils

不会工作。

我必须再上移一个目录:
In [19]: cd ..
/home/user/workspace/myproj

In [20]: from mypkg.utils import capture

In [21]: cap = capture.Capture

IPython 可以导入位于当前工作目录中的包和模块,也可以从导入路径中的目录导入。我可以将包添加到导入路径,以便能够从任何工作目录导入。
In [23]: import sys

In [24]: sys.path.append('/home/user/workspace/myproj')

In [25]: cd
/home/user

In [26]: from mypkg.utils import capture

您可以使用 sys.path.append使您的模块“具有自我意识”,但是正如 alpha_989 所指出的那样,它可能会导致名称冲突。但是,在从交互式终端 session 中执行包层次结构中的工作时,这是一种有用的解决方法。

关于python - 导入如何在 IPython 中工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25283230/

相关文章:

python - Python 新手……Python 3 和 Matplotlib

python - 如何使用 SQLAlchemy、自动加载和 Pyramid?

VS 2015 中的 Python IntelliSense/代码完成

python - 导入错误 : No module named IPython

python - Jupyter notebook python 在 Windows 10 上崩溃

.net - Path.Combine 的安全版本

python - keras模型的权重为nan

jupyter-notebook - 如何从另一个 ipython 笔记本导入?

Linux 好像获得了很多 *at 调用?这些的动机是什么?

postback - 由于相对路径问题,自定义404页面无法回传