簡體   English   中英

在 python3 中動態導入模塊 - 問題

[英]Dynamically importing module in python3 - issue

在一個項目中,我想根據版本號動態導入正確的模塊。 為此,我使用 importlib,只要 package 是源代碼的一部分,就可以找到工作。

AdminApi = import_module(f"{self.version}", "AdminApi").AdminApi

文件夾結構如下所示:

Admin-Package / 
    - __init__.py  # Contains dynamic class loader
    - admin64/
        - __init__.py  # contains AdminApi v6.4
        - ...
    - admin65/...
        - __init__.py  # contains AdminApi v6.5
        - ...

但是,現在我發現自己需要將代碼解耦到它自己的 package 中,以便在另一個項目中重復使用。 所以我把這部分源碼打包了。 然而,這似乎會導致與路徑相關的問題。 這似乎意味着 importlib 無法幫助我。

到目前為止,感謝: https://stackoverflow.com/a/54138717/5731101我已經到了這一點:

import importlib
from pathlib import Path

path = Path(__file__).resolve().parent
script_path = os.path.join(path, version, '__init__.py')

spec = importlib.util.spec_from_file_location(f"AdminApi", script_path)
AdminApi = importlib.util.module_from_spec(spec)
spec.loader.exec_module(AdminApi)

不幸的是, spec.loader.excec_module失敗並出現錯誤: ModuleNotFoundError: No module named 'AdminApi'即使 class 在通過路徑提供的文件中清楚地可用。

如果有人能幫助我解決這個問題,我將不勝感激。

我決定在 importlib 的工具箱中嘗試另一個工具基於這個答案: https://stackoverflow.com/a/67692/5731101

from importlib.machinery import SourceFileLoader

foo = SourceFileLoader("AdminAPI", "/path/to/file.py").load_module()
foo.AdminAPI()

這種方法檢測 class 沒有問題,只需正確導入所有內容。

暫無
暫無

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

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