使用Python 3.4.2的Python控制台
我在PyCharm Community Edition 4.5.4中的Python控制台中正确运行的模块中定义了一个函数:
ReloadTest.py:
def reloadtest(x):
print("Version A: {}".format(x))
Python控制台:
Python 3.4.2 (v3.4.2:ab2c023a9432, Oct 6 2014, 22:15:05) [MSC v.1600 32 bit (Intel)] on win32
>>> from ReloadTest import reloadtest
>>> reloadtest(1)
Version A: 1
将功能修改为"版本B"后,PyCharm无法找到更改,importlib.reload(ReloadTest)
给我错误。
我每次修改模块时都必须重新加载Python控制台或重启PyCharm。我做错了什么?处理这个问题的最佳方法是什么?
ReloadTest.py:
def reloadtest(x):
print("Version B: {}".format(x))
Python控制台:
>>> reloadtest(1)
Version A: 1
>>> from ReloadTest import reloadtest
>>> reloadtest(1)
Version A: 1
>>> import importlib
>>> importlib.reload(ReloadTest)
Traceback (most recent call last):
File "<input>", line 1, in <module>
NameError: name 'ReloadTest' is not defined
>>> from ReloadTest import reloadtest
>>> reloadtest(1)
Version A: 1
>>> import ReloadTest
>>> reloadtest(1)
Version A: 1
答案 0 :(得分:14)
您可以指示Pycharm在更改后自动重新加载模块,方法是将以下行添加到{{1}中的settings
-> Build,Excecution,Deployment
-> Console
-> Python Console
}}:
Starting Script
此函数来自IPython,如下所述:Reloading submodules in IPython
答案 1 :(得分:6)
我花了一些时间来理解之前的答案......而且,如果您需要运行的代码块位于脚本的中间,而您不想修改为运行,那么这个答案并不是很实用它一次。
您可以这样做:
import importlib
importlib.reload(my_module)
from my_module import my_function
然后,您可以使用更新版本的函数运行代码。
适用于PyCharm Community Edition 2016.3.2
编辑w.r.t.第一条评论: 这仅在您首次导入模块本身时有效(否则您会收到第一条评论中所述的错误)。
import my_module
from my_module import my_function
# Now calls a first version of the function
# Then you change the function
import importlib
importlib.reload(my_module)
from my_module import my_function
# Now calls the new version of the function
答案 2 :(得分:4)
让它开始工作!
我应该导入整个模块from Module import function
,而不是import Module
,然后通过Module.function()
调用该函数。这是因为
from ReloadTest import reloadtest
和
importlib.reload(ReloadTest)
不能一起去。
>>> import ReloadTest
>>> ReloadTest.reloadtest(1)
Version A: 1
进行更改后:
>>> importlib.reload(ReloadTest)
<module 'ReloadTest' from 'C:\\...\\ReloadTest.py'>
>>> ReloadTest.reloadtest(2)
Version B: 2
答案 3 :(得分:2)
由于这个问题专门询问了PyCharm,请查看PyCharm Support site上的答案。这个答案几乎与@ wokbot相同,区别在于PyCharm不需要import importlib
。如果您打算经常使用from ... import ...
,它还会在import ...
之后使用reloadtest
技巧来简化打字。
In[2]: import ReloadTest
In[3]: from ReloadTest import reloadtest
In[4]: reloadtest(1)
Out[4]: Version A: 1
...进行更改
In[5]: reload(ReloadTest)
Out[5]: <module 'ReloadTest' from 'C:\\...\\ReloadTest.py'>
In[6]: from ReloadTest import reloadtest
In[7] reloadtest(2)
Out[7]Version B: 2