2016-04-26 191 views
0

我正在創建一些模塊GUI(描述圖形界面),它需要另一個模塊somecalc(進行一些計算)。後者導入標準庫:os,sys,time導入其他子模塊並忽略標準庫

目標是最終構建一個包。

我無法找到關於包裝和/或其他自主研發的模塊中引入其他子模塊的約定:

  1. 不弄亂名字空間(並自動完成在IPython中):

    • 我不希望看到somecalc.ossomecalc.syssomecalc.time
  2. ,而無需重新導入已經進口的somecalc

    • 即使我在somecalc.py書面方式import os as _os解決問題#1標準庫,我也做同樣的兩種方式。如果我做內GUI以下測試:
    • somecalc.os is os #TRUE(在somecalc.pyimport os
    • somecalc._os is os #TRUE(從IPython中沒有自動完成與somecalc.pyimport os as _os
  3. 無需繁瑣調用標準庫,例如當我簡單寫os.listdir時寫somecalc.os.listdir。除此之外,我不認爲其他開發人員是否願意與我一起開展項目。

我知道,一旦我希望把我的文件夾成一個包,我建議增加一個__init__.py文件用我所有的進口。但是當我開發/調試我的子模塊時(使用if __name__ = '__main__'以下的代碼),根目錄中的__init__.py文件將被忽略。除此之外,我還需要在我的GUI.py文件的開頭寫上import somecalc

什麼是約定?

回答

1

在您的__init__.py只暴露您需要暴露的內容。創建其他需要標準庫的.py,然後導入你需要的內容。

$ tree GUI/ 
GUI 
├── __init__.py 
└── somecalc 
    ├── __init__.py 
    ├── somecalc.py 

$ cat GUI/__init__.py 
import somecalc 

$ cat GUI/somecalc/__init__.py 
from somecalc import get_time 

$ cat GUI/somecalc/somecalc 
import os 
import sys 
import time 

def get_time(): 
    return time.time() 

這樣,當你輸入somecalc,你只看到get_timesomecalc子模塊:

$ python 
Python 2.7.9 (default, May 20 2015, 15:38:28) 
[GCC 4.7.2] on linux2 
Type "help", "copyright", "credits" or "license" for more information. 
>>> import GUI 
>>> dir(GUI) 
[..., 'somecalc'] 
>>> dir(GUI.somecalc) 
[..., 'get_time', 'somecalc'] 
>>> dir(GUI.somecalc.somecalc) 
[..., 'get_time', 'os', 'sys', 'time'] 
>>> 
+0

您的解決方案並不讓我從GUI訪問標準庫,或在更麻煩方式:現在somecalc.os.listdir成爲somecalc.somecalc.os.listdir。 – Wli

+0

使用'import sys'訪問標準庫?問題是什麼 ? – Cyrbil

+0

我不確定,這就是爲什麼我問大會。 因此,即使模塊「x」已經導入到子模塊「sm」中,我仍然必須每次導入「x」到所有已導入「sm」的模塊中,對吧? 這是我發現奇怪的,因爲我從來沒有在下載的模塊目錄下找到標準庫。 – Wli