![](/img/trans.png)
[英]Organizing package Python - importing modules that are used with the package
[英]Python Importing modules in a package
我目前有一個我創建的具有許多功能的模塊。
它變得相當大,所以我想我應該把它變成一個 package 並將功能分開以使其更易於管理。
在我真正做到這一點之前,我只是在測試這一切是如何工作的,如果它看起來有點脆弱,我深表歉意。
我創建了一個名為pack_test
的文件夾,其中有:
__init__.py
foo.py
bar.py
__init__.py
包含:
__all__ = ['foo', 'bar']
from . import *
import subprocess
from os import environ
在控制台中,我可以編寫import pack_test as pt
這很好,沒有錯誤。
pt.
兩個標簽顯示我可以在其中看到pt.bar
、 pt.environ
、 pt.foo
和pt.subprocess
。
到目前為止一切都很好。
如果我想在foo.py
或bar.py
中引用subprocess
或environ
,我該怎么做呢?
如果在bar.py
我有一個 function 它只是return subprocess.call('ls')
它錯誤說NameError: name 'subprocess' is not defined 。 一定有我遺漏的東西使我能夠從上面的級別引用子流程? 據推測,一旦我可以從中獲得語法,我也可以以類似的方式調用 environ 嗎?
我可以看到的另一種選擇是在foo.py
和bar.py
中都有import subprocess
subprocess ,但是當我可以在更高級別一次使用它時,讓它出現在多個文件中對我來說似乎有點奇怪,特別是如果我繼續擁有大量文件而不是本示例中的 2 個文件。
TL;博士:
__init__.py
:
import foo
import bar
__all__ = ["foo", "bar"]
foo.py
:
import subprocess
from os import environ
# your code here
bar.py
import subprocess
from os import environ
# your code here
一定有我遺漏的東西使我能夠從上面的級別引用子流程?
不,這是預期的行為。
import
加載一個模塊(如果還沒有),將其緩存在sys.modules
(idem) 中,並將導入的名稱綁定到當前命名空間中。 每個 Python 模塊都有(或“是”)它自己的命名空間(沒有真正的“全局”命名空間)。 IOW,你必須在每個模塊中導入你需要的東西,即如果 foo.py 需要subprocess
,它必須明確地導入它。
起初這似乎有點乏味,但從長遠來看,它確實有助於 wrt/可維護性 - 您只需閱讀模塊頂部的導入(pep 08:始終將所有導入放在模塊的開頭)即可知道名字的來源。
此外,您不應在 python shell (即使那樣......)之外的任何地方使用星號導入(又名通配符導入又名from xxx import *
) - 這是一個維護定時炸彈。 不僅因為您不知道每個名稱的來源,還因為這是重新綁定已導入名稱的可靠方法。 想象一下,您的 foo 模塊定義了 function “func”。 某處有“from foo import *; from bar import *”,然后在代碼中調用 func。 現在有人編輯 bar.py 並添加了一個(不同的)“func”function,突然你調用失敗了,因為你沒有調用預期的“func”。 現在享受調試吧……現實生活中的例子通常比這復雜一點。
因此,如果您希望自己的頭腦清醒,不要偷懶,也不要試圖變得聰明,只需做簡單顯而易見的事情:在模塊頂部顯式導入您感興趣的名稱。
(在這里,做過等)
您可以創建 modules.py 包含
import subprocess
import os
然后在 foo.py 或您的任何文件中。
from modules import *
然后,您文件中的導入語句為 static,當您想添加一個可供所有人訪問的附加模塊時,只需更新 modules.py。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.