导入当前包

时间:2016-06-22 14:09:51

标签: python python-3.x import

我正在编写脚本并使用-i参数运行它,以便在完成后保持repl打开,以便能够查看有关我在调试时使用的对象的信息。

为了避免必须退出并重新运行脚本,我发现我可以修改并保存脚本,然后导入[script-name],然后使用[script-name]调用我的main方法。 -method]()。

现在我想编写一个单字符方法(为方便起见):

def x():
    import [this script]
    [this script].[main-method]()

但也可以更改脚本的文件名并保留easy-reloading功能,而无需更改代码。

我尝试过使用importlib(见下文)无济于事。

def y():
   import importlib
   this = importlib.import_module("".join(sys.argv[0].split(".py"))) # sys.argv[0] gives [module-name].py and the rest of the code inside the parentheses removes the ".py"
   this.[main-method]()

2 个答案:

答案 0 :(得分:1)

import,在其任何一个版本中,只重新加载一次脚本。您正在寻找reload功能:

from importlib import reload
import sys

def main():
    pass

def x():
    reload(sys.modules[__name__])
    main()

此代码将重新加载您当前所在的模块(可能是__main__)并从中重新运行方法。如果要从解释器中重新加载脚本,请执行以下操作:

>>> from importlib import reload
>>> def x():
...     reload(mymodule)
...     mymodule.main()
...
>>> import mymodule
>>> mymodule.main()
>>> # Do some stuff with mymodule
>>> x()

如果脚本位于奇怪的位置,您可能必须将import mymodule替换为mymodule = importlib.import_module("".join(sys.argv[0].split(".py")))

来源:

答案 1 :(得分:0)

我做到了!

def x(): # make what I'm doing now at this very moment easier
   main()
   print("It works!")

def y(): # calls x() after loading most recent version
   import importlib
   from imp import reload
   this = importlib.import_module("".join(sys.argv[0].split(".py"))) # sys.argv gives [module-name].py and the rest of the code inside the brackets removes the ".py"
   this = reload(this)
   this.x()