嗨,请有人帮忙。我有一个ubuntu服务器(python 2.7.12)和一个Windows服务器(python 2.7.13)。下面的代码在ubuntu框上完美运行,但我在Windows服务器上收到错误。
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)
追踪(最近的呼叫最后):
文件“C:/scripts/m1.py”,第32行,in test.valid1(检查)
文件“C:/scripts/m1.py”,第28行,在valid1中 self.valid(检查)
文件“C:/scripts/m1.py”,第22行,有效 print res.get(timeout = 5)
在get中输入文件“C:\ Python27 \ lib \ multiprocessing \ pool.py”,第567行 提高self._value
NameError:未定义全局名称'test'
答案 0 :(得分:1)
问题是,当您的脚本生成另一个进程并执行test
函数时,您的run
变量未定义。您的test
变量仅在__name__
变量设置为"__main__"
时设置。解释器会在生成的流程中将__name__
值更改为"__parents_main__"
,因此不会定义test
。正如您所知,删除if语句会设置变量,因为这不再取决于__name__
被设置为'__main__'
,但正如下面的注释所指出的,这将导致自我复制的工作线程并导致错误。
添加:
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'
并具有相同的效果。