簡體   English   中英

從同一個包中的另一個模塊導入包層次結構根目錄下的python模塊的最佳方法

[英]Best way to import python module at the root of a package hierarchy from another module in the same package

我寫了一個包P.在P的根處有一個模塊m0。 在P內部的某個地方有m1,m2,......模塊需要從m0導入

當然,我可以在每個模塊中編寫:

from P.m0 import ...

但是,如果我更改PI的名稱必須重新訪問所有位置並重寫此類語句。

我也可以使用相對導入但是如果我在包層次結構中移動一個不同級別的模塊,我必須修復點數。

還有一些其他原因,但是底線,我真的想說從我的包的根目錄中的模塊m0導入,表達這個的最佳方式是什么?

那是不可能的。

但是,如果你執行主要的重構,你必須更新一些相對導入的子包之間的模塊移動不是一個大問題。

如果您不使用相對導入,則同樣適用於重命名頂級包名稱 - 甚至可以通過搜索和替換所有文件來快速完成。

如果您願意稍微修改一下您的問題,那么您可以僥幸成功。

如果您的包裹的唯一入口點受到控制; 例如,您只需通過調用testsuite package/.../module.py來測試您的代碼

那么你可以確保你做的第一件事是先import firstthing ,然后在package / firstthing.py中你有:

import sys
import os.path
packageDir = os.path.split(__name__)[0]
sys.path[:] = sys.path+[packageDir]  # or maybe you want it first...

主要的警告是,如果不通過入口點,您將無法運行python文件。 我總是希望為我在python中編寫的每個項目都這樣做(為了使相對導入工作得很好),但我個人覺得這很不方便,我只是放棄了。


還有第二種選擇。 不是不合理的規定,你的包需要Python路徑另一個包。 這個包可能是一個執行主要黑客攻擊的實用程序包。 例如,如果包的名稱是“x”,您可以import x ,它將使用inspect模塊在解釋器堆棧上執行反射,讓您找出從哪個模塊導入它。 然后你可以通過上升父目錄來做一個“向后os.walk”,直到你找到你的包的根(通過檢查一些特殊的指示文件,或清單,或什么)。 然后代碼將以編程方式通過sys.path執行python路徑的上述修改。 它與上面的相同,但您可以自由地執行諸如運行任何python文件而無需經歷可怕的入口點。

如果你對shell環境有極大的控制,你也可以只增加$ PYTHONPATH來包含你的包目錄,但這在很多方面都非常脆弱,而且相當不優雅。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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