[英]Python 3.6 import at runtime
我目前正在編寫一個程序,其中將Python文件復制到具有主模塊的docker-container中,然后應在Threads中執行。
假設我具有以下結構:
.
├── app.py
├── rule1
| └── foo.py
├── rule2
| └── bar.py
:
: ...
:
└── ruleX
└── foobar.py
想法是,子目錄中的每個.py
都實現一個接口,然后由main.py
在其自己的線程中main.py
。 另一方面, main.py
然后與主機上運行的程序進行通信。 線程唯一要做的就是創建已加載類的實例並調用.analyze()
-function。
到目前為止,我發現以下代碼:
import importlib.util
spec = importlib.util.spec_from_file_location("module.name", "/path/to/file.py")
foo = importlib.util.module_from_spec(spec)
spec.loader.exec_module(foo)
foo.MyClass()
但就我而言,我不確定為module.name
輸入什么。 以及如何調用該函數?
查找此信息的地方是文檔 。 您顯然在某處找到的代碼基本上只是文檔中的示例之一 ,所有說明和上下文都已刪除。
您還需要稍微了解一下Python模塊和軟件包的工作方式,但是否則,您在此處不了解的所有內容都應在同一文檔章節中找到。
但就我而言,我不確定為
module.name
輸入什么。
module.name
只是模塊的名稱。 這是將在回溯中顯示的名稱,它可能會影響其他調試和反射代碼(例如,如果您在任何地方使用inspect
),以及可能從模塊內部導入的相對名稱。 (我猜想,除了調試輸出之外,所有這些都不會影響您,在這種情況下,即使您弄錯了它也沒有太大關系。)
無論如何,如果不確定,並且希望看到一些示例而不是瀏覽干燥而混亂的文檔,請打開交互式解釋器,然后嘗試以下操作:
import <whatever>
print(<whatever>.__name__, <whatever>.__file__)
…針對不同的<whatever>
值(從stdlib,從PyPI安裝的軟件包以及從您自己的項目)獲得一個想法。 您看到的__name__
是由spec_from_file_location
下的機器傳遞給spec_from_file_location
的名稱。
但簡短的版本是:
rule1
像“命名空間包”一樣使用,請使用rule1.foo
。 rule1
像sys.path上的另一個路徑一樣工作,請使用foo
。 以及如何調用該函數?
調用類的方式完全相同:
foo.analyze()
最后一件事:您正在構建的是一個非常標准的插件系統,具有最簡單的插件API(“必須公開不帶參數的函數analyze
”)。 您可能需要四處尋找具有插件系統的其他應用程序,以閱讀其代碼以獲取想法。 (但是請注意,其中許多控件都與Python 2.7或3.3向后兼容,這意味着導入的實際步驟將大不相同,並且您不想使用它們使用的舊代碼。)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.