为啥给我这个错误:TypeError: cannot pickle '_io.TextIOWrapper' object?

Posted

技术标签:

【中文标题】为啥给我这个错误:TypeError: cannot pickle \'_io.TextIOWrapper\' object?【英文标题】:Why is giving me this error :TypeError: cannot pickle '_io.TextIOWrapper' object?为什么给我这个错误:TypeError: cannot pickle '_io.TextIOWrapper' object? 【发布时间】:2020-11-04 07:17:06 【问题描述】:

我正在尝试使用多处理,其想法是从 Bing 搜索的结果中获取链接,但使用 selenium 更改其中一种配置(cep 配置)。我有一个列表(filecep)中的所有cep,我想将所有结果写在一个csv文件上。 这是我的 getUrlCleans 函数:

def getUrlCleans(search):


driver = webdriver.Firefox()

f = open('out/'+str(date.today())+'.csv','w')
f.write('url,cep')
f.write('\n')

url_cleans=[] 

pool=mp.Pool(mp.cpu_count())
pool.starmap(getUrlbyCEP,[(cep,driver,search,f) for cep in filecep])
pool.close()
f.close()

这是我的 getUrlbyCEP 函数:

def getUrlbyCEP(cep,driver,search,f):

driver.get('https://www.bing.com/account/general?ru=https%3a%2f%2fwww.bing.com%2f%3fFORM%3dZ9FD1&FORM=O2HV65#location')
                
    
cepInput = driver.find_element_by_id('geoname')
cepInput.clear()
cepInput.send_keys(cep)
time.sleep(0.5)
driver.execute_script("window.scrollTo(0,document.body.scrollHeight)")


saveButon=driver.find_element_by_id('sv_btn')
saveButon.click()




try:
    driver.find_element_by_id('geoname')        
    # continue
except:
    pass

searchInput=driver.find_element_by_id('sb_form_q')
searchInput.send_keys(search)

driver.find_element_by_id('sb_form_q').send_keys(Keys.ENTER)
time.sleep(0.5)

url_cleans=[]

for i in range(2):
    
    url_cleans=getLinks(driver,url_cleans)
    time.sleep(2)
    driver.find_element_by_xpath('//*[@title="Próxima página"]').click()
    url_cleans=getLinks(driver,url_cleans)
    for u in url_cleans:
        f.write(u+','+cep)
        f.write('\n')

    

我终于打电话了

getUrlCleans('sulamerica')

ang 它给了我错误....我不知道为什么?

【问题讨论】:

multiprocessing 基本上腌制进程需要与之通信的对象。 threading 对你有用吗? 我没用过线程,好建议。 谢谢@PanwenWang 我听从了你的建议,成功了! 【参考方案1】:

因此,我没有使用多处理,而是使用了线程并且它有效。这是我改变的,而不是:

pool=mp.Pool(mp.cpu_count())
results = pool.starmap(getUrlbyCEP,[(cep,driver,search,f) for cep in filecep])

来自多处理库 (mp),我使用了这个:

from multiprocessing.dummy import Pool as ThreadPool    
pool = ThreadPool(4)
results = pool.map(f_partial, filecep)

【讨论】:

线程池的性能影响与多处理池完全不同。在 Python 中,由于全局解释器锁 (GIL),线程仅适用于 IO 绑定进程。尽管 ThreadPool 可能不会发生此错误,但请务必注意 Python 线程和进程之间的根本区别。

以上是关于为啥给我这个错误:TypeError: cannot pickle '_io.TextIOWrapper' object?的主要内容,如果未能解决你的问题,请参考以下文章

为啥 pHp 会给我这个错误? [复制]

Django:“TypeError:[] 不是 JSON 可序列化的”为啥?

为啥这个表创建脚本会给我错误?

为啥 heroku 会给我这个“不兼容的类型”错误?

为啥这个 fgets 函数会给我一个分段错误?

请解释为啥这个 C 代码给我一个分段错误?