[英]import -force mymodule for python 3.6+?
有沒有辦法在python 3.6+中做到這一點?
import -force mymodule
我只想要一個Python命令,兩者都:
(1)首次加載模塊,並且
(2)強制重新加載模塊(如果已加載且沒有推倒)。
(這不是重復的問題,因為我要問的是不同的東西。我想要的是一個函數調用,它將像同一個函數調用一樣執行上述第(1)和(2)項。我不想創建一個手動編碼有關是否可以發出“ import”或“ imp.reload”的決策。我只想為單個函數“ def”使用python代碼,它可以檢測哪種情況合適並自動為我做出有關如何導入的決策(1)或(2)。
我在想這樣的事情:
def import_force(m):
import sys
if m not in sys.modules:
import m
else:
import importlib
importlib.reload(m)
除此之外,我不知道如何將模塊名稱作為參數傳遞。 只是給我一個錯誤,沒有這樣的名為“ m”的模塊
您在新答案中半糾正了一個缺失的步驟,那就是您需要在使用它的每個作用域中分配新模塊。 最簡單的方法是返回模塊對象,並將其綁定到函數外所需的名稱。 您最初的實現是90%正確:
import sys, importlib
def import_force(m):
if m not in sys.modules:
return __import__(m)
else:
return importlib.reload(sys.modules[m])
現在,您可以從命令行使用此功能來替換import
,例如:
my_module = force_import('my_module')
每當您發現自己使用exec
執行一項任務時,已經有很多定義明確的機器可用,您就會有代碼味。 也沒有理由每次都重新導入sys
和importlib
。
此函數應執行您想要的操作:
def import_force(name):
needs_reload = name in sys.modules
module = importlib.import_module(name)
if needs_reload:
module = importlib.reload(module)
return module
# Usage example:
os = import_force('os')
另一種方法是編寫您自己的導入掛鈎 ,我不會描述。
但是請注意, 這是一種反模式 ,我不鼓勵在每次導入時重新加載模塊的做法。
如果這是出於調試目的,那么我建議您使用在線上提供的許多自動重新加載器解決方案之一 :它們會監視您的Python文件中的更改,並且當您進行修改時,它們會自動重新導入模塊。
您的函數不起作用的原因有兩個:
import
關鍵字不解析變量,因此import m
並不意味着“導入名稱在變量m
的模塊”,而是意味着“導入名為m
的模塊”。
importlib.reload
需要模塊對象,而不是模塊名稱。
import sys
import importlib
# importing with a sledgehammer... simple, effective, and it always works
def import_force(name):
module = importlib.import_module(name)
module = importlib.reload(module)
return module
#assuming mymodule.py is in the current directory
mymodule = import_force("mymodule")
這是可能的! 但是第一次才能正確編碼有點棘手...
import sys
import importlib
def import_force(modstr):
if modstr not in sys.modules:
print("IMPORT " + modstr)
cmd = "globals()['%s'] = importlib.import_module('%s')" % (modstr, modstr)
exec(cmd)
else:
print("RELOAD " + modstr)
cmd = "globals()['%s'] = importlib.reload(%s)" % (modstr, modstr)
exec(cmd)
如果您在當前目錄中有一個模塊文件,請調用“ mymodule.py”,然后按以下方式使用它:
Py> import_force("mymodule")
2.0版:
def import_force(modstr):
if modstr not in sys.modules:
print("IMPORT " + modstr)
globals()[modstr] = importlib.import_module(modstr)
else:
print("RELOAD " + modstr)
globals()[modstr] = importlib.reload(sys.modules[modstr])
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.