[英]Library import structure in python
我正在python3x中開發一個庫,嘗試導入所有模塊,類和函數時遇到了一些麻煩。
/example.py
/math/
__init__.py
linalg.py
solve() #inside module.py
這里的問題是,我希望能夠簡單地將我的庫導入example.py內,然后像numpy一樣使用不同模塊內定義的所有函數,例如:
import math as m
m.solve()
而不是使用
import math as m
m.linalg.solve()
要么
import math.linalg as m
m.solve()
我應該如何定義__init__.py以這種方式包含所有內容。 我試過使用dir(linalg),絕對導入等,因為我無法理解。
謝謝。
解決方案 :
最后,我要做的是在它們之間創建一個包裝層以隱藏模塊依賴性。
在__init__.py內部:
from .linalg import *
from .wrappers import *
然后創建了wrappers.py和linalg.py:
from math.linalg import solve
def wrapper_solver():
{
solve()
}
然后在example.py中:
import math as m
m.wrapper_solver()
希望它可以幫助某人。
兩種解決方案:
example.py
:
#!/usr/bin/env python3
import math.linalg as m # rather than just `import math`.
m.solve()
math/__init__.py
:
from linalg import solve
編輯:
您可以按照Muhammed Ajwahir的建議修改python路徑。 但以我的拙見,這並不能解決問題。 這是導入路徑的問題。 默認情況下,根目錄會添加到Python路徑(執行./example.py
)。 這足以將所有內容導入子目錄。 我認為沒有必要修改路徑。
編輯2:
如果要在__init__.py
導入所有內容,也可以使用from math import *
(這被認為是不好的做法 )。 或將所有內容手動添加到__init__.py
。
但是在您的情況下,您可以考慮將樹重構為:
.
|-- example.py
|-- math.py
忘記了math
目錄結構。 這樣,一個簡單的import math
就足夠了。
我還要指出, math
已經是Python中的現有庫。 我認為您應該考慮重命名以避免名稱沖突。
在linalg.py中編寫__ all __
編寫要公開給包的所有函數。
示例__ all __ =['solve']
然后在__ init __.py
(存在linalg.py文件的模塊)中, from .linalg import *
寫入文件from .linalg import *
這將導入__ all __
定義的所有函數(注意,函數名應該是唯一的)。 然后在__ init __.py
寫__ all __ = linalg.__ all __
__ init __.py
__ all __ = linalg.__ all __
(如果有更多文件,請使用+
,例如__ all __ = linalg.__ all __ +file2.__ all __
。
然后在這個例子中,你可以調用solve
為from math import solve
。
如果要在文件夾中添加某些內容,則必須將該文件夾添加到系統目錄中。 您可以通過-
import sys
sys.path.insert(0, '/path/to/math/folder')
import linalg as m
m.solve()
編輯1:
要么
在__init__.py中,添加
__all__ = ["linalg", "foo", "barr"]
等等,並在主腳本中將import math as m
希望對您有所幫助。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.