簡體   English   中英

在運行時導入Python 3.6

[英]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.

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