簡體   English   中英

Python 在 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.barpt.environpt.foopt.subprocess
到目前為止一切都很好。


如果我想在foo.pybar.py中引用subprocessenviron ,我該怎么做呢?

如果在bar.py我有一個 function 它只是return subprocess.call('ls')它錯誤說NameError: name 'subprocess' is not defined 一定有我遺漏的東西使我能夠從上面的級別引用子流程? 據推測,一旦我可以從中獲得語法,我也可以以類似的方式調用 environ 嗎?

我可以看到的另一種選擇是在foo.pybar.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.

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