[英]How do imports work in IPython
我对有关导入语句在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
在某处有一些简明的文档吗?
问题是我从包层次结构中较低的位置导入模块,而不是在模块的import语句中使用。 所以,如果我进入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
所指出的,它可能会导致名称冲突。 但是,从交互式终端会话在包层次结构内部进行工作时,这是一种有用的解决方法。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.