2011-01-11 53 views
22
stuff/ 
    __init__.py 
    mylib.py 
    Foo/ 
     __init__.py 
     main.py 
     foo/ 
      __init__.py 
      script.py 

script.py要進口mylib.py如何做到相對進口在Python

這只是一個例子,但是我真的只想做一個模塊的相對進口的父目錄。我已經嘗試了各種東西,得到這個錯誤...

Attempted relative import beyond toplevel package

我讀的地方,從程序開始的地方不應該在包裝,我試圖改變結構,像這樣的腳本...

stuff/ 
    mylib.py 
    foo.py // equivalent of main.py in above 
    foo/ 
     __init__.py 
     script.py 

但得到同樣的錯誤。

我該如何做到這一點?這甚至是一個適當的方法?

編輯:在Python 2

回答

28

與它擺弄多一點之後,我意識到如何設置它,以及特異性我不會用foo的緣故酒吧名稱。我的項目目錄設置爲...

tools/ 
    core/ 
     object_editor/ 
      # files that need to use ntlib.py 
      editor.py # see example at bottom 
      __init__.py 
     state_editor/ 
      # files that need to use ntlib.py 
      __init__.py 
     ntlib.py 
     __init__.py # core is the top level package 
    LICENSE 
    state_editor.py # equivalent to main.py for the state editor 
    object_editor.py # equivalent to main.py for the object editor 

object_editor.py的線看起來像......

from core.object_editor import editor 

editor.py的線看起來像......

from .. import ntlib 

或或者

from core import ntlib 

關鍵是,在我給出的問題中,「主」腳本是從包內運行的。一旦我將它移出來,創建了一個特定的包(core),並且將我希望編輯共享的庫(ntlib)移動到該包中,所有內容都是令人驚歎的。

1

import ..foo..stuff.mylib應該沒問題

編輯起飛擴展

+4

我不認爲這是有效的語法。 – random 2011-01-11 08:43:29

+0

`from ..foo..stuff.mylib import any whatever` should ok – tekknolagi 2011-01-11 08:46:30

+0

import sys sys.path.append() import Bar
tekknolagi 2011-01-11 08:49:36

10

但只要「東西」是不是在你的Python路徑中,你有沒有選擇,而不是添加路徑。

如果你知道你的script.py從東西的水平,你可以做例子:

import sys 
import os 
sys.path.append(os.path.join(os.path.dirname(__file__), '..', '..')) 
1

從看來,你不能使用相對進口導入未打包文件的PEP

所以,你會需要一個__init__.py添加的東西,改變你的進口,以類似from .mylib import *

然而,PEP似乎並沒有考慮到保持MYLIB模塊中打包。所以你可能需要改變你如何調用你的庫函數。

另一種方法是將MyLib進入一個子包,並導入它作爲from .libpackage import mylib

7

我在Windows 7上運行Python 3.4.2,並在此之上撕掉了我的頭髮。

如果運行的是這些:

蟒蛇-m單元測試 蟒蛇-m單元測試發現

...我會得到 '超越頂層包未遂相對進口' 的錯誤。

對我來說,解決方案是在我的[test_stock.py]中刪除「..」。 線爲: 進口..stock股票

將其改爲:現貨進口庫存

..和它的作品。

文件夾結構:

C:\ 
    | 
    +-- stock_alerter 
      | 
      +-- __init__.py 
      +-- stock.py 
      | 
      \-- tests 
        | 
        +-- __init__.py 
        \-- test_stock.py