windows vs ubuntu NameError:未定义全局名称

时间:2017-05-10 21:04:49

标签: python python-2.7 multiprocessing

嗨,请有人帮忙。我有一个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'

1 个答案:

答案 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'并具有相同的效果。