2011-10-14 4 views
2

注::実際の質問はコンパイルエラーとしてマークされているので、私は答えを受け入れていません。私は@ TorelTwiddlerの回答に投票しました。なぜなら、彼は回避策を出しましたが、問題を理解したいと思います。pydev-ideが自分自身をインポートするモジュールについて文句を言う


私は自己テストコードを含む簡単なモジュールを持っています。インタラクティブなセッションでの使用を容易にするために、セルフテストコード自体がリロードされます(モジュール)。

これは、PyDev(RunAs)と対話ウィンドウ(手動でsys.pathを修正してインポート中)で動作します。しかし、PyDevはIDEはまだライン

import Mod1 

に私は自分自身からimport Mod1は名前がリロードためには、Test()を実行しているどんな文脈で解決可能でなければならないということである理由を「コンパイル」/赤-Xのエラーを与えます成功するために。たとえば、新しいインタラクティブウィンドウからMyMainをインポートすると、名前Mod1がわからないため、reloadの呼び出しはインポートせずに失敗します。

これを修正できる方法はありますか?だけ(そうPyDevはで使用

# Mod1.py 
def Test(): 
    """ 
    run the self-test, but first force a reload of the module under test (this mod) 
    """   
    import Mod1  # *****'COMPILE' ERROR HERE****** 
    import imp 
    Mod1 = imp.reload(Mod1) 

    TestImpl() 

def TestImpl(): 
    """ 
    self test here 
    since I reload above, I can change this code and re-run from an interactive window 
    this has to be a seperate function for the reload in Test to have an effect on this code 
    """ 
    print(input("enter")) 

エクストラブートストラップ・モジュール:

モジュールの問題で... Mod1ははるかに大きいプロジェクトの一部ではなく、コンパイルは開発より困難として、それは一貫してマークされました私は()

# MyMain.py 
import Mod1 
Mod1.Test() 

PyDevは/プロジェクトPYTHONPATHを「など、実行して」正しい表示されることができ、このフォルダは)私のワークスペースのルートにあります。実際にPyDev OKで実行されるので、間違いなく正しいですか?

/MyDirectory 

ありがとうございます!

+0

私はIDEのエラーを抑制することができます@TorelTwiddler(ありがとう) - 私は今のところこれを使用していますが、私は実際にこのエラーは私には有効ではないように、 – mike

+0

別のコメントは、常に自己貧しいフォーム_自己インポートすることができました。ここで私の使用例は受け入れられるように見える - 誰もがこのコンベンションが普遍的に悪いのならば/なぜ重み付けできる? – mike

答えて

2

あなたは、無限ループを作成するには、モジュールをリロードしてしまうためにのみ再びなど再びモジュールをリロードし、それ自体の中にモジュール...で

をリロードした場合、あなたのMyMain.pyあなたはこれを行うことができるかもしれません:

import Mod1 
reload(Mod1) 

Mod1.Test() 

私はあなたがすべてのモジュールをリロードしなければならない理由を正確に測るために、そのハードさらにコードサンプルなしで推測、しかし、あなたがする必要がある場合、それは(モジュールでそれをやってなくて)

+0

私は同意していません - 私は関数 'Test'からリロードしています。明らかにvoid f(){f();}(Cの構文)を呼び出すと、あなたは再帰的に閉じ込められますが、それは私がやっていることではありません。 Mod1が読み込まれたとき、 'import Mod1'の追加呼び出しは行われません。 – mike

+0

無限ループに入りません。各モジュールは一度インポートされます( 'import'を使うときはもちろん、' reload'や何かを呼び出すことによって再インポートを強制することができます)、その後のインポートはモジュールオブジェクトへの参照を返します。 – delnan

+0

@Snaxib OP質問に記載されているように、モジュールはインタラクティブなターミナルで_自動的にモジュールをリロードして、インタラクティブなウィンドウからモジュールを手動でリロードすることなく_モジュールにコードが変更された後でテストを実行できます。 – mike

2

を動作するはずですIおそらくSnaxibの現在の書式を維持したい場合は、行末に#@UnresoledImportを追加してEclipseにエラーを無視させることができます(Ctrl + 1を押して自動入力します)。

+0

このチップをありがとう。それは短期間で私を助けます。しかし、これは本当の解決策を持っているべき問題のようです。私のPYTHONPATHは正しいです(少なくともPyDevは私のproj OKを実行します)。そして、 'Mod1'はパスにあります。コンパイル時エラーを投げてはいけません。 – mike

2

フォーマットについては、Snaxibの答えに関する議論から別の回答を追加してください。

変更しないモジュールは、TestMyStuff、変更内容はTheTestです。

#TestMyStuff.py 
def go(): 
    import TheTest 
    reload(TheTest) 
    TheTest.runTest() 

#TheTest.py 
def runTest(): 
    #run my tests and change things often here. 
    print(input("enter")) 

、iteractiveシェルから、あなたはそれが実行されますたびにリロードTheTest持っているであろう、TestMyStuff.go()を実行することができます。

+0

自己インポートが_always_悪いということが正しい場合は、この回答を受け入れることができます。しかし、私はそのユースケースが悪いことを見ていないし、IDEが(ハックなしで)不平を終わらせるようにすべきだと感じている。私は私のポストにこのスタイルの質問の明確化を求めるコメントを追加しました)。ありがとう! – mike

+0

@mike、正直言って、それはあなた自身をインポートするには悪いフォームかどうかは分かりません。私はまた、私は決して_always_とは言いませんでした。しかし、私が使っている言語のIDEを書いた人は、私がしているよりも、その言語についてもっと知っていると思います。 Pythonを使って、このエラーが発生しないようにする方法や、PyDevがもうこのエラーについて不平を言う方法を探していますか?それがPyDevの場合は、バグレポートを作成する必要があります。 – TorelTwiddler

+0

私は_EITHER_ PyDevに不平を言わせたくない、_OR_私がしたことが間違っていた理由を理解する:)私はPyDevにフォローアップする必要があるとあなたは正しいと思います。 – mike

1

私は#@ UnresolvedImportアノテーションを付けてPySideに無視するように指示しました。私の場合、実際の回避策はありません。なぜならpickle(yamlを使って間接的に使用しています)を使用する場合、正しいインポートパスはモジュールのロード方法によって異なります。モジュールの外側からオブジェクトをピックルしたくない場合、ピリングが内側から行われた場合は機能しません。自己紹介はあなたにその可能性を与えます。

関連する問題