Python 3.4.2的Python控制台
我在PyCharm Community Edition 4.5.4中的Python控制台中正确运行的模块中定义了一个函数:
ReloadTest.py:
def reloadtest(x):
print("Version A: {}".format(x))
Run Code Online (Sandbox Code Playgroud)
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
Run Code Online (Sandbox Code Playgroud)
在我将函数修改为"版本B"后,PyCharm无法找到更改,并importlib.reload(ReloadTest)给出了错误.
我每次修改模块时都必须重新加载Python控制台或重启PyCharm.我做错了什么?处理这个问题的最佳方法是什么?
ReloadTest.py:
def reloadtest(x):
print("Version B: {}".format(x))
Run Code Online (Sandbox Code Playgroud)
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
Run Code Online (Sandbox Code Playgroud)
Mor*_*ken 23
可以在通过添加下列行来改变指示Pycharm自动重新加载模块settings- > Build,Excecution,Deployment- > Console- >Python Console中Starting Script:
%load_ext autoreload
%autoreload 2
Run Code Online (Sandbox Code Playgroud)
Update: This function requires IPython (pip install ipython) as described here: Reloading submodules in IPython
hxi*_*xin 12
让它工作!
相反from Module import function,我应该导入整个模块import Module,然后通过调用函数Module.function()。这是因为
from ReloadTest import reloadtest
Run Code Online (Sandbox Code Playgroud)
和
importlib.reload(ReloadTest)
Run Code Online (Sandbox Code Playgroud)
不能一起去。
>>> import ReloadTest
>>> ReloadTest.reloadtest(1)
Version A: 1
Run Code Online (Sandbox Code Playgroud)
进行更改后:
>>> importlib.reload(ReloadTest)
<module 'ReloadTest' from 'C:\\...\\ReloadTest.py'>
>>> ReloadTest.reloadtest(2)
Version B: 2
Run Code Online (Sandbox Code Playgroud)
Esk*_*app 10
我花了一些时间来理解之前的答案......而且,如果您需要运行的代码块位于脚本中间,而您不想修改为运行它一次,那么这个答案就不太实用了.
你可以简单地做:
import importlib
importlib.reload(my_module)
from my_module import my_function
Run Code Online (Sandbox Code Playgroud)
然后,您可以使用该函数的更新版本运行代码.
适用于PyCharm Community Edition 2016.3.2
编辑第一条评论:这仅在您首次导入模块本身时才有效(否则您会收到第一条评论中所述的错误).
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
Run Code Online (Sandbox Code Playgroud)
由于这个问题专门询问了 PyCharm,请查看PyCharm 支持网站上的答案。这个答案几乎与 @wokbot 的相同,区别在于 PyCharm 消除了import importlib. 如果您打算经常使用,它还使用了from ... import ...after 的技巧来使输入变得更容易。import ...reloadtest
In[2]: import ReloadTest
In[3]: from ReloadTest import reloadtest
In[4]: reloadtest(1)
Out[4]: Version A: 1
Run Code Online (Sandbox Code Playgroud)
...做出改变
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
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
13458 次 |
| 最近记录: |