2014-02-18 112 views
0

我打开更多过程用python来通过urlib2检索文件,我只把这个调用放到了函数中。python过程返回全局变量

t = Process(target=traer, args=(dir, listado[contador],)) 

这是在过程对象调用函数

def traer(dir,y): 
    global listado2 
    try: 
     file = urllib2.urlopen(dir+y) 
     nombre=y 
     output = open('C:/ndfd/degrib/bin/archivos/'+nombre ,'wb') 
     output.write(file.read()) 
     output.close() 
    except urllib2.HTTPError, e: 
     print 'HTTPError = ' + str(e.code) 
    except urllib2.URLError, e: 
     listado2.append(y) 
     print 'URLError = ' + str(e.reason) 

这是

if __name__ == '__main__': 
    global listado 
    global listado2 
    listado=[] 
    listado2=[] 
    crear_trip(dir,listado) 
    salida_bath(dir,listado,listado2) 

内部salida_bath归档文件的根是一个循环while内部的打开过程。

在异常中我想追加到一个名为listado2的全局变量,但这不起作用,说我这是未定义的listado2。

我解决这个问题对我来说,改变策略

的salida_bath

manager = Manager() 
    listado2 = manager.dict() 

把过程的康塔多内和过去的新listado2的过程

t = Process(target=traer, args=(contador,dir, listado[contador],listado2)) 
创建

并在traer功能中改变这一点。外界认为这

except urllib2.URLError, e: 
     listado2[contador]=y 
     print 'URLError = ' + str(e.reason) 

检查工作

for x in listado2.values(): 
     listado.append(x) 
print listado 

回答

3

global statement只通知解析器变量是不被认为是局部的,但如果它不存在,并没有定义一个新的变量。在访问它之前,你仍然有责任在某处初始化它。你似乎认为它是一个列表(listado2.append(y)),但是在你的代码中你实际上并没有用列表值初始化它。 Python如何知道哪个.append()方法在从未分配过任何东西的变量上调用?

+0

你好,我在调用过程之前初始化,但在外面。该过程调用另一个初始化全局变量的函数 – virtualsets

+2

然后,您应该编辑您的问题并包含代码,该代码显示_how_,_where_和_when_您初始化'listado2'变量。 – lanzz

+0

谢谢你的时间。我解决了,我不知道它是不好还是不好,但这是行得通的。 ;)对不起英语不好。 – virtualsets