簡體   English   中英

如何在IPython中進行導入

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM