2017-05-10 51 views
0

こんにちは。私はubuntuサーバー(Python 2.7.12)とWindowsサーバー(Python 2.7.13)を持っています。下のコードはウインクボックスでは完全に動作しますが、Windowsサーバでエラーが発生します。windows対ubuntu NameError:グローバル名は定義されていません

import multiprocessing 
import time 

check="h" 

def run(check): 
    return test.validityCheck(check) 

class t: 

    def validityCheck(self,check): 
     time.sleep(4) 
     print(check) 
     errorStatus=str("error") 
     return ("error state: "+errorStatus) 

    def valid(self,check): 
     print 'starting....' 
     pool = multiprocessing.Pool(1) 
     res = pool.apply_async(run, [check]) 
     try: 
      print res.get(timeout=5) 
     except multiprocessing.TimeoutError: 
      error=1 
     print 'end' 

    def valid1(self, check): 
     self.valid(check) 

if __name__=='__main__': 
    test=t() 
    test.valid1(check) 

Traceback (most recent call last):
File "C:/scripts/m1.py", line 32, in test.valid1(check)
File "C:/scripts/m1.py", line 28, in valid1 self.valid(check)
File "C:/scripts/m1.py", line 22, in valid print res.get(timeout=5)
File "C:\Python27\lib\multiprocessing\pool.py", line 567, in get raise self._value
NameError: global name 'test' is not defined

+0

完全なトレースバックを投稿できますか? –

+0

追加されたトレースバック –

+0

'run'関数を見てください。あなたはどこにでもオブジェクト "test"を定義していないので、エラーメッセージに "NameError:グローバル名 'test'が定義されていません" –

答えて

1

問題は、スクリプトが別のプロセスを生成し、run機能を実行するとき、あなたのtest変数が定義されていないということです。 test変数は、変数が"__main__"に設定されている場合にのみ設定されました。インタプリタは、testが定義されないように、__name__の値を生成されたプロセスで"__parents_main__"に変更します。あなたが把握したように、ifステートメントを削除すると、がもはや'__main__'に設定されていないので、変数を設定しますが、以下のコメントで指摘されているように、これは自己複製workerスレッドにつながりエラーになります。

追加:

if __name__=='__main__' or __name__=='__parents_main__': 
    test=t() 
# Updated as per comments below. Only run this function in the original process, 
# not a spawned worker thread 
if __name__=='main': 
    test.valid1(check) 
あなたのコードに

、それが正常に動作します。また、testを底辺の外側に定義すると、if __name__=='main'という条件付きで同じ効果が得られます。

+0

私の友人の伝説に感謝します。私に多くの欲求を救いました –

+0

喜んで私は助けることができました!私はちょっと答えを更新して、なぜこれが起こるのか、もう少し詳しく知りたいと思っています。 – Mike

+1

これは、ワーカープロセスも 'valid1'を実行し、' valid1'を実行してより多くのワーカーを生成するより多くのワーカーを生成するようになります。 – user2357112

関連する問題