PyInstaller打包Scrapy调用GUI遇twisted请求生成失败错误求助
问题描述
在PyCharm的venv虚拟环境中,我用PyInstaller打包了一个通过Popen调用Scrapy的GUI程序:
- 原本在终端里,Popen调用Scrapy能正常完成爬取,但打包后GUI能打开,Popen的stderr却提示
scrapy not found - 了解到PyInstaller默认使用用户级包而非venv的包后,我在用户环境安装了Scrapy,此时打包的GUI可以调用Scrapy,但出现了Scrapy运行错误:
Traceback (most recent call last): File "/usr/local/lib/python3.6/dist-packages/twisted/internet/defer.py", line 62, in run return f(*args, **kwargs) File "/usr/local/lib/python3.6/dist-packages/scrapy/core/downloader/middleware.py", line 49, in process_request return (yield download_func(request=request, spider=spider)) twisted.web._newclient.RequestGenerationFailed: [<twisted.python.failure.Failure builtins.AttributeError: __enter__>]
- 另外,在用户环境(venv外)的终端运行Scrapy也会报同样的错,但venv内终端运行完全正常。
同时想请教:在用户环境安装包供PyInstaller打包的方式是否合理?
相关代码
GUI代码
import tkinter as tk from tkinter import messagebox as tkms from tkinter import ttk import shlex from subprocess import Popen import json def get_url(): #printing Entry url to a file harvest = None def watch(): global harvest if harvest: if harvest.poll() != None: # Update your progressbar to finished. progress_bar.stop() #if harvest finishes OK then show confirmation message otherwise show error. if harvest.returncode == 0: mes = tkms.showinfo(title='progress', message='Scraping Done') if mes == 'ok': root.destroy() else: tkms.showinfo(title='Error', message=f'harvest returncode == {harvest.returncode}') harvest = None else: # indicate that process is running. progress_bar.grid() progress_bar.start(10) root.after(100, watch) def scrape(): global harvest command_line = shlex.split('scrapy runspider ./scrape.py') with open ('stdout.txt', 'wb') as out, open('stderr', 'wb') as err: harvest = Popen(command_line, stdout=out, stderr=err) watch() root = tk.Tk() root.title("Title") url = tk.StringVar(root) entry1 = tk.Entry(root, width=90, textvariable=url) entry1.grid(row=0, column=0, columnspan=3) my_button = tk.Button(root, text="Process", command=lambda: [get_url(), scrape()]) my_button.grid(row=2, column=2) progress_bar = ttk.Progressbar(root, orient=tk.HORIZONTAL, length=300, mode='indeterminate') progress_bar.grid(row=3, column=2) progress_bar.grid_forget() root.mainloop()
Scrapy爬虫代码
import scrapy import json class ImgSpider(scrapy.Spider): name = 'img' #allowed_domains = [user_domain] start_urls = ['xyz'] def parse(self, response): title = response.css('img::attr(alt)').getall() links = response.css('img::attr(src)').getall() with open('../images/urls.txt', 'w') as f: for i in title: f.write(i) f.close
内容的提问来源于stack exchange,提问作者user_0525
相关产品推荐
相关产品推荐

