Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/297.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python:强制每个导入重新加载_Python_Metaprogramming_Python Import_Monkeypatching - Fatal编程技术网

Python:强制每个导入重新加载

Python:强制每个导入重新加载,python,metaprogramming,python-import,monkeypatching,Python,Metaprogramming,Python Import,Monkeypatching,有没有一种方法可以强制import x在Python中总是重新加载x,就像我调用了reloadx,或者为Python 3调用了imp.reloadx一样?或者一般来说,是否有某种方法可以在每次运行importx时强制运行某些代码?我对猴子补丁或黑客技术没意见 我已经尝试将代码移动到一个单独的模块中,并从该单独文件中的sys.modules中删除x。我对导入钩子做了一些尝试,但没有做太多尝试,因为根据文档,只有在检查sys.modules缓存后才会调用它们。我还尝试了使用自定义dict子类monk

有没有一种方法可以强制import x在Python中总是重新加载x,就像我调用了reloadx,或者为Python 3调用了imp.reloadx一样?或者一般来说,是否有某种方法可以在每次运行importx时强制运行某些代码?我对猴子补丁或黑客技术没意见

我已经尝试将代码移动到一个单独的模块中,并从该单独文件中的sys.modules中删除x。我对导入钩子做了一些尝试,但没有做太多尝试,因为根据文档,只有在检查sys.modules缓存后才会调用它们。我还尝试了使用自定义dict子类monkeypatching sys.modules,但每当我这样做时,从模块导入子模块引发KeyError,我猜sys.modules不是真正的字典


基本上,我正在尝试编写一个调试工具,这就是为什么一些黑客可以在这里使用。我的目标很简单,importx比importx要短;x、 y.

如果您真的想更改import语句的语义,您必须修补解释器。导入检查命名模块是否已加载,如果已加载,则不再执行任何操作。您必须完全改变这一点,而这在解释器中是硬连接的


也许您可以通过修补Python源代码来使用myImport'modulename'而不是import modulename?这将使Python本身成为可能。

如果您真的想更改import语句的语义,您必须修补解释器。导入检查命名模块是否已加载,如果已加载,则不再执行任何操作。您必须完全改变这一点,而这在解释器中是硬连接的


也许您可以通过修补Python源代码来使用myImport'modulename'而不是import modulename?这将使Python本身成为可能。

以Alfe的回答为线索,我让它这样工作。这是模块级的

def custom_logic():
    # Put whatever you want to run when the module is imported here

# This version is run on the first import
custom_logic()

def __myimport__(name, *args, **kwargs):
    if name == 'x': # Replace with the name of this module
        # This version is run on all subsequent imports
        custom_logic()
    return __origimport__(name, *args, **kwargs)

# Will only be run on first import
__builtins__['__origimport__'] = __import__
__builtins__['__import__'] = __myimport__

我们是monkeypatching内置的,这就是为什么在运行myimport时定义origimport的原因

以阿尔夫的回答为线索,我得到了这样的结果。这是模块级的

def custom_logic():
    # Put whatever you want to run when the module is imported here

# This version is run on the first import
custom_logic()

def __myimport__(name, *args, **kwargs):
    if name == 'x': # Replace with the name of this module
        # This version is run on all subsequent imports
        custom_logic()
    return __origimport__(name, *args, **kwargs)

# Will only be run on first import
__builtins__['__origimport__'] = __import__
__builtins__['__import__'] = __myimport__

我们是monkeypatching内置的,这就是为什么在运行myimport时定义origimport的原因

如果您真的想更改import语句的语义,则必须修补解释器。导入检查命名模块是否已加载,如果已加载,则不再执行任何操作。您必须完全改变这一点,而这在解释器中是硬连接的。也许您可以通过修补Python源代码来使用myImport'modulename'而不是import modulename?这将使Python本身成为可能。@Alfe:我认为这条评论值得作为答案发布。完成,感谢支持:如果您真的想更改import语句的语义,您必须修补解释器。导入检查命名模块是否已加载,如果已加载,则不再执行任何操作。您必须完全改变这一点,而这在解释器中是硬连接的。也许您可以通过修补Python源代码来使用myImport'modulename'而不是import modulename?这将使Python本身成为可能。@Alfe:我认为这条评论应该作为一个答案发布。完成了,谢谢你的支持:嗯,猴子补丁导入。我没想到。嗯,猴子打补丁。我没想到。