Python scrapy上的Pyinstaller错误?

Python scrapy上的Pyinstaller错误?,python,scrapy,pyinstaller,Python,Scrapy,Pyinstaller,我正在使用scrapy导入它。我使用pyinstaller构建了python文件。构建之后,我运行了文件。/new.py。但错误是: FileNotFoundError: [Errno 2] No such file or directory: '/tmp/_MEIbxALM3/scrapy/VERSION' [23450] Failed to execute script new 您在构建独立程序时没有正确使用Pyinstaller。以下是Pyinstaller工作原理的简短外行描述:Py

我正在使用scrapy导入它。我使用pyinstaller构建了python文件。构建之后,我运行了文件。/new.py。但错误是:

 FileNotFoundError: [Errno 2] No such file or directory: '/tmp/_MEIbxALM3/scrapy/VERSION'
[23450] Failed to execute script new

您在构建独立程序时没有正确使用Pyinstaller。以下是Pyinstaller工作原理的简短外行描述:Pyinstaller将Python解释器、必要的DLL(适用于Windows)、项目的源代码和它能找到的所有模块打包到文件夹或自解压可执行文件中。Pyinstaller不包括在运行Pyinstaller时生成的最终.exe(Windows)、.app(macOS)、文件夹等中找不到的模块或文件

下面是发生的情况:

FileNotFoundError:[Errno 2]没有这样的文件或目录:'/tmp/_MEIbxALM3/scrapy/VERSION'
您运行了冻结/独立程序。一旦你这样做了,你的程序就被“提取”到你计算机上的一个新的临时文件夹
/temp/\u MEIbxALM3/
。这个文件夹包含Python解释器、程序的源代码和Pyinstaller设法找到的模块(以及一些其他必要的文件)

Scrapy模块不仅仅是一个模块。这是一个完整的框架。它有自己使用的纯文本文件(除了Python文件之外)。而且,它本身也导入了很多模块

Scrapy框架尤其不适合Pyinstaller,因为它使用许多方法导入Pyinstaller无法“看到”的模块。此外,Pyinstaller基本上不会在最终版本中包含非.py文件的文件,除非您告诉它

那么,到底发生了什么事?

您计算机上的“普通”scrapy模块中存在的文本文件“版本”(与pip或pipenv一起安装)未包含在程序生成的copycat scrapy模块中。Scrapy需要这个文件;Python为您提供了
FileNotFoundError
,因为它从未包含在内。因此,您必须使用Pyinstaller将该文件包含在程序的构建中

如何告诉Pyinstaller在哪里可以找到模块和文件?

表示只需将丢失的文件从计算机上的安装位置复制到Pyinstaller中的生成文件夹中。这确实有效。但是,有一种更好的方法,Pyinstaller可以为您做更多的工作(防止进一步出现
ImportError
s和
FileNotFoundError
s)。见下文:

build.spec
文件是您的朋友

spec
文件只是Pyinstaller用来告诉它如何构建程序的Python文件,就像配置文件一样。了解更多关于他们的信息。下面是一个真实的
build.spec
文件的示例,我最近使用它构建了一个带有Windows GUI的Scrapy程序(我的项目名为B.O.T.Bot):

导入粘液
gooey\u root=os.path.dirname(gooey.\u文件)
gooey_languages=Tree(os.path.join(gooey_root,'languages'),前缀='gooey/languages')
gooey_images=Tree(os.path.join(gooey_root,'images'),前缀='gooey/images')
a=分析(['botgui.py'],
pathex=['C:\\Users\\Colton\\.virtualenvs\\bot-bot-jbkevqb\\Scripts','C:\\Program Files(x86)\\Windows Kits\\10\\Redist\\ucrt\\DLL\\x86'],
HiddeInputs=['bot.spider.spider'],
hookspath=['.\\hooks\\'],
运行时挂钩=无,
数据=[('.\\spider\\','.\\spider\\'),('.\\settings.py','.'),
('.\\scrapy.cfg','.'),('.\\items.py','.'),('.\\itemloaders.py','.'),
('.\\middleware.py','),('.\\pipelines.py','))
]
)
pyz=pyz(a.pure)
选项=[('u',无,'OPTION'),('u',无,'OPTION'),('u',无,'OPTION')]
exe=exe(pyz,
a、 剧本,
a、 二进制文件,
a、 拉链,
a、 数据,
选项,
gooey_语言,将它们添加到收集的文件中
粘糊糊的图片,这里也一样。
name='BOT\u BOT\u GUI',
debug=False,
条带=无,
upx=真,
控制台=假,
加窗=真,
icon=os.path.join(goey_root,'images','program_icon.ico'))
#coll=COLLECT(exe,
#a、 二进制文件,
#a、 拉链,
#a、 数据,
#选项,
#gooey_语言,将它们添加到收集的文件中
#粘糊糊的图片,这里也一样。
#name='BOT\u BOT\u GUI',
#debug=False,
#strip=False,
#upx=真,
#控制台=假,
#加窗=真,
#icon=os.path.join(goey_root,'images','program_icon.ico'))
如果要生成文件夹而不是独立的
.exe
,请取消对最后一个区域的注释。这是特定于我的计算机和项目结构的配置文件。因此,在您的文件中,您必须更改一些内容(例如
pathex
),以告诉Pyinstaller在Windows 10上哪里可以找到DLL。但是,前提是相同的

我的项目目录如下所示:

botbotgui.py  botbot.py  hooks  images  __init__.py  itemloaders.py  items.py  middlewares.py  pipelines.py  __pycache__  scrapy.cfg  settings.py  spiders
请特别注意
hooks/
目录。使用hooks将使您避免今后的许多麻烦。请阅读有关Pyinstaller的hooks功能的更多信息。在
hooks/
目录中有一个用于Scrapy的hook文件。这将告诉Pyinstaller包含许多模块和文件,否则,如果您不这样做,它将丢失这些模块和文件t使用
.spec
文件。这是我到目前为止在这里写的最重要的一件事。如果不执行此步骤,每次尝试运行使用Pyinstaller构建的Scrapy程序时,您都会得到
ImportError
s。Scrapy导入Pyinstaller遗漏的许多模块

hook scrapy.py
(注意:钩子文件的名称必须与此相同):

从PyInstaller.utils.hooks导入collect\u子模块,收集\u数据\u文件
#这将收集所有动态导入的scrapy模块和数据文件。
hiddenimports=(收集子模块('scrapy'))+
pyinstaller build.spec