簡體   English   中英

import -force mymodule for python 3.6+?

[英]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執行一項任務時,已經有很多定義明確的機器可用,您就會有代碼味。 也沒有理由每次都重新導入sysimportlib

此函數應執行您想要的操作:

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文件中的更改,並且當您進行修改時,它們會自動重新導入模塊。

您的函數不起作用的原因有兩個:

  1. import關鍵字不解析變量,因此import m並不意味着“導入名稱在變量m的模塊”,而是意味着“導入名為m的模塊”。

  2. 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.

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