2015-10-24 1 views
5

Pythonコンソールモジュールを変更した後、どのようにリロードするのですか? Pythonの3.4.2と

私はPyCharmコミュニティ版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

使用IPythonとその[自動再](https://ipython.org/ipython-doc/3/config/extensions/autoreload.html)関数を作ります。 :) –

答えて

2

は、それが動作するには、Get!
from Module import functionの代わりに、import Moduleというモジュール全体をインポートしてから、Module.function()で関数を呼び出す必要があります。

from ReloadTest import reloadtest 

importlib.reload(ReloadTest) 

は一緒に行くことができないためです。

>>> importlib.reload(ReloadTest) 
<module 'ReloadTest' from 'C:\\...\\ReloadTest.py'> 
>>> ReloadTest.reloadtest(2) 
Version B: 2 
2

私は前の回答を理解するために私にいくつかの時間がかかった...そして、あなたが実行する必要があるコードのチャックがある場合にも、その答えは非常に実用的ではありません。変更を行った後

>>> import ReloadTest 
>>> ReloadTest.reloadtest(1) 
Version A: 1 

スクリプトの途中で、一度実行するために変更するような気がしません。

は、あなたは、単に行うことができます。

import importlib 
importlib.reload(my_module) 
from my_module import my_function 

その後、あなたは、機能の更新バージョンを使用してコードを実行することができます。

PyCharmコミュニティ版で動作します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 
+1

あなたの答えは、私のオリジナルの質問が言っているものとまったく同じです。これはNameErrorを引き起こし、動作しません。今度はPyCharm Community Edition 2016.3.3をやり直してみました。それはまさに以前と同じです。私はあなたのものと私のものが違うのだろうと思っています。 – wokbot

+0

@armlet実際、モジュール名を定義するようにモジュールを最初にインポートした場合にのみこれが機能するということを忘れてしまいました。私は自分の答えを編集しました:) – Eskapp

+1

Pythonに関する私のより良い知識に照らして、あなたの最初の答えは私のものと似ていますが、当時は実際にそれを働かせるのに時間がかかりました。だから私は、コードの多くの場所で修正された関数が呼び出された場合や関数名で直接呼び出された場合、どうやってどうやってやるのか混乱するかもしれないような、新しいユーザーのためにこの答えを残しておきます。 – Eskapp

0

この質問はPyCharmについて、具体的尋ねたので、PyCharm Support siteの答えをチェックしてみてください。この答えは@ wokbotのものとほとんど同じですが、PyCharmはimport importlibの必要性を取り除いています。また、reloadtestを頻繁に使用する場合は、import ...の後にfrom ... import ...のトリックを使用して入力を容易にします。

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 
関連する問題