看板 Python 關於我們 聯絡資訊
各位好,以下是本人要處理的檔案 main.py containers /module1.py /module2.py /module3.py module1, 2, 3中的程式碼類似,皆如下: class Test1(self): def __init__(self, num): self.num = num def test1(self): print("test1") 我現在想在main.py中import所有在module1,2,3中的class,但是如果寫成 from module1 import * from module2 import * from module3 import * 好像不太好,之後在containers裡還會增加很多module 不知道各位版友有沒有什麼好方法? 我查過一些資料,像這篇裡有些人去修改__all__,或是使用pkgutil https://reurl.cc/AKNxqj 但我都沒有成功 我嘗試過用importlib for name in os.listdir("containers"): if name.endswith(".py"): module = name[:-3] importlib.import_module(module) 但還是沒有辦法將所有module匯入 import_module 好像只能這樣用: x = importlib.import_module(module1) x.test1.test1() 還有看過一個方法是: for name in os.listdir("containers"): if name.endswith(".py"): module = name[:-3] test_spec = importlib.util.spec_from_file_location(module, "containers/" + module + ".py") test_module = importlib.util.module_from_spec(test_spec) test_spec.loader.exec_module(test_module) 我以為執行完上面這幾行後,可以直接用Test1.test1(),程式裡還是找不到Test1 -- ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 108.254.89.199 (美國) ※ 文章網址: https://www.ptt.cc/bbs/Python/M.1648512048.A.09F.html
f416720001: https://i.imgur.com/o8xkj8p.jpg 03/29 08:08
f416720001: 在子資料夾內寫個__init__.py,裡面把所有.py import 03/29 08:11
f416720001: ,外面main.py直接import即可,這是做package的方法 03/29 08:11
lycantrope: 應該是想問有沒有dynamic方式去import而不用一個個寫 03/29 12:55
AndCycle: 關鍵字是 importlib 03/29 13:19
blc: eval('from '+pyfilename.replace('.py','')+'import *') 03/29 16:17
blc: 不過要先拿到檔案列表放迴圈 03/29 16:18
lycantrope: eval不能拿來import 03/29 16:51
blc: 那是我錯了 03/29 17:06
※ 編輯: VivianAnn (108.254.89.199 美國), 03/29/2022 17:42:09
TakiDog: 不要拿eval做危險的事… 03/29 18:06
lycantrope: 是可以改用exec做import,但一樣不建議 03/29 22:15
jameschiou: 易讀性跟後續程式碼分析,一般還是會寫__all__就是 03/31 22:13