簡體   English   中英

python中的庫導入結構

[英]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()

希望它可以幫助某人。

兩種解決方案:

  1. 要么將整個路徑導入到linalg.py:

example.py

#!/usr/bin/env python3                                                         

import math.linalg as m # rather than just `import math`.

m.solve()
  1. 可以使用__init__.py從數學直接獲得求解

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 __

然后在這個例子中,你可以調用solvefrom 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.

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