語境:我目前有一個程序,它使用另一個SO 線程中顯示的方法從它們的文件路徑(在映射的網絡驅動器中)加載一組插件。這些插件被設計為滾動發布,這意味著我需要不斷地訪問來編寫它們。當前機制鎖定文件,所以我必須要求所有人關閉軟件,以便我可以更新文件。問題:我想知道是否有一種方法,可能使用與上面鏈接的方法類似的方法,從io.BytesIO插件原始內容的對象中導入文件(因此解鎖文件讓我隨意進行更改)。更普遍:更具體地說,我可以在不接觸物理磁盤的情況下將原始模塊內容保存在內存中嗎?如果這樣的事情是不可能的,有沒有辦法將這些模塊完全加載到內存中,這樣我就可以解鎖正在導入的文件?正如我在評論中所說,我知道您可以在基于 Linux 的操作系統上安裝虛擬文件系統(這可能解決了我的問題),但遺憾的是,我為 Windows 和 Microsoft 開發永遠無法讓您的生活變得輕松!:-)筆記:我不是在問我可以在哪里復制這些文件以從本地版本(例如臨時、緩存等)導入它們。我知道這是一個非常專業的問題,因此非常感謝任何幫助
1 回答

Smart貓小萌
TA貢獻1911條經驗 獲得超7個贊
雖然不是像我最初要求的那樣來自對象,但在找到這篇非常有用的文章io.BytesIO
后,我能夠從其源中導入模塊。我沒有在這里復制代碼,因為它非常大,盡管我能夠讓它成功導入虛擬模塊。
以下代碼是在我修改加載器以刪除公共前綴后,并通過首先執行源代碼,globals
從中獲取,最后使用 Python 的type
方法創建模塊類來創建模塊的類。
它不是特別漂亮,而且肯定違反了一些 Python 風格的建議,所以我絕對愿意改進!
source = """def hello():
print("I don't want to say hi to the world")"""
name = "my_module"
glo = {}
exec(source, glo)
injector = DependencyInjector()
injector.provide(name, type(name, (), glo))
injector.install()
foo = __import__(name)
foo.hello()
添加回答
舉報
0/150
提交
取消