我对IPython中import语句的工作方式有点困惑。我在网上搜索什么也没找到。
隐式相对导入适用于Python 2,但我不知道ipythonforpython3是否仍然是这样。
使用点语法的相对导入似乎根本不起作用:
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语句中使用的位置更低的位置导入模块的。所以如果我cd到utils目录并运行
然后捕获成为层次结构的顶层。所以捕获模块中的import语句
超越了最高层。Python不知道“.”指的是什么,因为模块不知道它们属于哪个包。如果我切换回mypkg目录,我也会遇到同样的问题
在这种情况下,utils是顶级的,所以
会有用的,但是
不会起作用的。
我得再往上移动一个目录:
IPython可以导入位于当前工作目录中的包和模块,也可以从导入路径中的目录中导入。我可以将包添加到导入路径,以便能够从任何工作目录导入。
您可以使用
sys.path.append
使模块“自我感知”,但正如alpha_989
所指出的,它可能会导致名称冲突。但是,当从交互式终端会话在包层次结构中执行工作时,这是一个有用的解决方法。相关问题 更多 >
编程相关推荐