Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/347.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python Can';尝试多处理时,请不要pickle本地对象_Python_Multiprocessing_Pickle - Fatal编程技术网

Python Can';尝试多处理时,请不要pickle本地对象

Python Can';尝试多处理时,请不要pickle本地对象,python,multiprocessing,pickle,Python,Multiprocessing,Pickle,我试图对一个网站进行多处理,在那里我得到一个我想从中获取信息的所有节点的列表,然后生成一个池,这样它就不用一个接一个地获取数据,而是并行地进行。我的代码如下: from selenium import webdriver from selenium.webdriver.common.by import By from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import

我试图对一个网站进行多处理,在那里我得到一个我想从中获取信息的所有节点的列表,然后生成一个池,这样它就不用一个接一个地获取数据,而是并行地进行。我的代码如下:

from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
import multiprocessing

def ResPartido(node):

   ft=node.find_element_by_css_selector('.status').text
   if ft.strip()!='FT': return
   hora=node.find_element_by_css_selector('.time').text
   names=list()
   for nam in node.find_elements_by_xpath(
            './/td[contains(@style,"text-align")]/a[contains(@id,"team")]'):
     name=nam.text
     if '(N)' in name:
        name=name.split('(N)')[0]
     names.append(name)
   score=node.find_element_by_css_selector('.red')

   return [hora,name,score.text]

if __name__ == "__main__":

   browser=webdriver.Chrome()
   SOME CODE
   nodes=browser.find_elements_by_xpath(
        '//tr[contains(@align,"center")]/following-sibling::tr[.//div[contains(@class,"toolimg")]]')
   p = multiprocessing.Pool()

   p.map(ResPartido,nodes)   <---Here is the error
   .......

   >>AttributeError: Can't pickle local object '_createenviron.<locals>.encodekey'
从selenium导入webdriver
从selenium.webdriver.common.by导入
从selenium.webdriver.support.ui导入WebDriverWait
从selenium.webdriver.support将预期的_条件导入为EC
导入多处理
def响应(节点):
ft=node.find_element_by_css_选择器('.status')。text
如果ft.strip()!='FT':返回
hora=node.find_element_by_css_选择器('.time').text
名称=列表()
对于node.find_元素中的nam(
'.//td[contains(@style,“text align”)]/a[contains(@id,“team”)]:
name=nam.text
如果名称中有“(N)”:
name=name.split(‘(N)’)[0]
name.append(name)
score=node。通过“.red”选择器查找元素
return[hora,name,score.text]
如果名称=“\uuuuu main\uuuuuuuu”:
browser=webdriver.Chrome()
一些代码
节点=浏览器。通过xpath查找元素(
'//tr[contains(@align,“center”)]/以下同级::tr[.//div[contains(@class,“toolimg”)]]
p=多处理。池()
p、 映射(响应,节点)>属性错误:无法pickle本地对象“\u createenviron..encodekey”
带有错误的python终端的图像


查看文档,它说列表是可拾取的对象,在主对象之前声明的函数也是可拾取的对象,所以我不明白在使用多处理时我做错了什么。

从我所阅读的内容来看,问题在于
节点
是webdriver对象的列表,这些对象是不可序列化的。考虑到这一点,我唯一可以采用的方法是以下方法

1-不要将整个标记作为节点列表的一个元素来获取,而是只获取使其与其他标记唯一的内容。在我的示例中,每行都有一个序列号标识符

nodes=browser.find_elements_by_xpath(
    '//tr[contains(@align,"center")]/following-sibling::tr[.//div[contains(@class,"toolimg")]]/@id').get_attribute()

nodes=['1232489','1242356',......]
2-将其与浏览器一起传递到地图功能

pr=partial(ResPartido,b=browser)
p.map(pr,nodes)
3-在ResPartido函数中,找到具有标识其@id的字符串的唯一行

browser.find_elements_by_xpath('//tr[contains(@id,%s)]' %s node)

有了这个我还没有测试过的旁路,我想我可以在可pickle对象上毫无问题地得到我想要的东西

呃,
\u createenviron..encodekey
?我不知道pickle在哪里被调用。你能找到它在哪里吗?我加了一张错误的图片。它在我调用map函数的行中。Variable nodes是一个html节点列表,基本上就是它。@accumulation
pickle
get被
多处理
使用。它将
pickle
任何对象,并在子流程中取消pickle。注意,
多处理
本质上是一个
线程
接口,位于
子进程
之上。共享状态为非共享状态-trivial@puppet我不熟悉
selenium
,但很可能,无论
节点是什么
对象,它都是不可pickle的。据我所知,它是一个围绕Java程序的Python绑定,因此,所有对象都不可pickle并不奇怪。