簡體   English   中英

從當前包導入全部

[英]Import all from current package

我有一個像這樣的包裹:

lib/
    __init__.py
    package/
        __init__.py
        module1.py
        module2.py
    framework.py

我的__init__.py的結構如下:

__all__ = ['module1', 'module2']

def run_all():
    for module in __all__:
        eval(module).Bot().start()

每個模塊都是一個小程序,它將在較大的程序中運行,並且創建了run_all()函數可以輕松地做到這一點。

如果我分別導入每個模塊,如下所示:

from lib.package import module1
from lib.package import module2

一切正常。 雖然,如果我嘗試導入所有內容:

from lib.package import *

甚至像這樣:

from . import *

我得到一個NameError,該包未定義。

如何導入包中的模塊以使run_all()正常工作?

編輯

當我from . import *添加from . import * from . import *from lib.package import *module.__init__.py (甚至什么也沒有)我收到此錯誤:

Traceback (most recent call last):
  File "./main.py", line 64, in <module>
    Bot().start()
  File "./main.py", line 45, in start
    package.run_all()
  File "/home/bkvaluemeal/Documents/bot/lib/package/__init__.py", line 16, in run_all
    eval(module).Bot().start()
  File "<string>", line 1, in <module>
NameError: name 'module1' is not defined

問題出在您的run_all函數上。 它遍歷字符串列表( __all__ )並嘗試評估它們。 您將可能需要使用__import__import_module代替(沒有測試下面的代碼自己,但它應該工作)...

def run_all():
    for module in __all__:
        mod = __import__("lib.package", globals(), locals(), [module], -1))
        getattr(mod, module).Bot().start()

要么

import importlib

def run_all():
    for module in __all__:
        mod = importlib.import_module("lib.package.{}".format(module))
        mod.Bot().start()

暫無
暫無

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

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