2017-10-19 100 views
3

我是Python軟件包的新手,並且我正在努力工作。我有3個套餐:engine,uidb。我想從另外兩個軟件包中使用db。什麼是正確的方法呢?從兩個其他軟件包(python3)導入一個通用軟件包

我不想安裝db包,因爲我目前正在同時開發3個包。

謝謝!


就目前而言,我試圖用鄰近的包的進口這樣做,但它吸收這麼多,我不知道這是這樣做的正確方法。 這個問題是密切相關的噸問題,如Relative imports in Python 3ValueError: attempted relative import beyond top-level package,但他們都沒有一個有效的,爲我工作:-(

這裏的答案是我到目前爲止有:

src/ 
    __init__.py  # empty file (is it useful?) 
    db/ 
    __init__.py # empty file 
    constants.py 
    ui/ 
    __init__.py # empty file 
    index.py 
    engine/ 
    ...some stuff... 

這裏是index.py:

from .. import db 
print(db.constants.stuff) 

但是,運行cd ui && python3 index.pypython3 -m index.py失敗SystemError: Parent module '' not loaded, cannot perform relative import

當我調整這個項目,我有時會得到其他的錯誤,如ValueError: Attempted relative import in non-package

從我讀的https://docs.python.org/3/tutorial/modules.html,這應該工作,不應該嗎?

我在做什麼錯?我應該做些什麼(做這麼簡單的事情)使用來自其他兩個軟件包的通用軟件包?

+0

你能用'tree'來分享整個項目結構嗎?因爲當前信息僅顯示每個包的實際文件。也許你對包和模塊感到困惑? – Arunmozhi

+0

這是實際的當前結構('engine'目前是空的,但最終需要'db'的東西)。所以是的,我現在每個包裝都有一個模塊。但包很快會增長 – Daladim

回答

0

__init__.py很有用,即使它是空的。它告訴python文件夾是一個python包。

我認爲你需要的是修改系統路徑。例如,假設你想將constants.py導入到index.py中,index.py應該是這樣的:

import sys 
sys.path.append("..") 
from db import constants 
+0

這個作品,非常感謝!但是,這種解決方法有多骯髒?我以爲我讀到這是非常骯髒的,所以我不想嘗試這個(但是,哎呀,這個工程,這是我擺脫這些進口擺弄幾個小時後我想要的) – Daladim

+0

此外,我知道空'__init __。py'很好,但我想知道頂級的功能有多麼有用。它沒有它,但也許定義一個頂層包是一個很好的做法? – Daladim

+0

它所做的只是將當前腳本所在的文件夾附加到路徑中,以便導入兄弟模塊。我不確定它是不是很髒,這是一種解釋。也就是說,改變你的項目結構以避免同胞進口可能是一個好主意。你可以有一個包含你的所有類和函數的源代碼目錄,然後在index.py的一個層次上面導入一切並運行一些主函數? –

相關問題