簡體   English   中英

使用pyinstaller和scrapy沒有這樣的文件或目錄錯誤

[英]No such file or directory error using pyinstaller and scrapy

我有一個使用scrapy的python腳本,我想使用pyinstaller將它變成一個exe文件。 生成exe文件沒有任何錯誤,但是當我打開它時發生錯誤。

FileNotFoundError: [Errno 2] No such file or directory: '...\\scrapy\\VERSION'

我試過重新安裝scrapy,但這沒有幫助。 我正在使用帶有 python3 的 Windows 10

完全公開:這是我對重復的類似問題的回答的轉貼。 我只是為了可見而將其放在這里。 這真正地回答了所提出的問題; 因此很重要。

構建獨立程序時,沒有正確使用Pyinstaller。 以下是對Pyinstaller的工作方式的簡短介紹:Pyinstaller將Python解釋器,必需的DLL(對於Windows),項目的源代碼以及它可以找到的所有模塊捆綁到文件夾或自解壓的可執行文件中。 Pyinstaller不包含在運行Pyinstaller時產生的最終.exe(Windows)、. app(macOS),文件夾等中找不到的模塊或文件。

所以,這是發生了什么:

 FileNotFoundError: [Errno 2] No such file or directory: '/tmp/_MEIbxALM3/scrapy/VERSION'

您運行了凍結/獨立程序。 完成此操作后,程序便被“提取”到計算機/temp/_MEIbxALM3/上的新臨時文件夾中。 該文件夾包含Python解釋器,程序的源代碼以及Pyinstaller設法找到的模塊(以及其他一些必要的文件)。

Scrapy模塊不僅僅是一個模塊。 這是一個完整的框架。 它使用自己的純文本文件(Python文件除外)。 並且,它本身會導入很多模塊。

Scrapy框架尤其不能與Pyinstaller配合使用,因為它使用許多方法來導入Pyinstaller無法“看到”的模塊。 另外,Pyinstaller基本上不會嘗試在最終版本中包括不是.py文件的文件, 除非您告知

那么, 到底發生了什么?

您計算機上的“普通”刮板模塊中已存在的文本文件“版本”(已通過pip或pipenv安裝)未包含在程序構建的copycat刮板模塊中。 Scrapy需要此文件。 Python會給您FileNotFoundError因為它從未被包含在內。 因此,您必須使用Pyinstaller將文件包含在程序的構建中。

您如何告訴Pyinstaller在哪里找到模塊和文件?

這個家伙說,只需將丟失的文件從計算機上的安裝位置復制到從Pyinstaller吐出的build文件夾中。 這確實有效。 但是,有一種更好的方法,Pyinstaller可以為您完成更多工作(防止您進一步獲得ImportErrorFileNotFoundError )。 見下文:

build.spec文件是您的朋友

spec文件只是Pyinstaller使用的Python文件(例如配置文件)來告訴它如何構建程序。 在此處閱讀有關它們的更多信息。 下面是一個真實的build.spec文件的示例,我最近使用build.spec文件通過Windows的GUI構建Scrapy程序(我的項目名為BOT Bot ):

import gooey
gooey_root = os.path.dirname(gooey.__file__)
gooey_languages = Tree(os.path.join(gooey_root, 'languages'), prefix = 'gooey/languages')
gooey_images = Tree(os.path.join(gooey_root, 'images'), prefix = 'gooey/images')
a = Analysis(['botbotgui.py'],
             pathex=['C:\\Users\\Colton\\.virtualenvs\\bot-bot-JBkeVQQB\\Scripts', 'C:\\Program Files (x86)\\Windows Kits\\10\\Redist\\ucrt\\DLLs\\x86'],
             hiddenimports=['botbot.spiders.spider'],
             hookspath=['.\\hooks\\'],
             runtime_hooks=None,
             datas=[('.\\spiders\\','.\\spiders\\'), ('.\\settings.py','.'),
                    ('.\\scrapy.cfg','.'), ('.\\items.py','.'), ('.\\itemloaders.py','.'),
                    ('.\\middlewares.py','.'), ('.\\pipelines.py','.')
                   ]
             )
pyz = PYZ(a.pure)

options = [('u', None, 'OPTION'), ('u', None, 'OPTION'), ('u', None, 'OPTION')]

exe = EXE(pyz,
          a.scripts,
          a.binaries,
          a.zipfiles,
          a.datas,
          options,
          gooey_languages, # Add them in to collected files
          gooey_images, # Same here.
          name='BOT_Bot_GUI',
          debug=False,
          strip=None,
          upx=True,
          console=False,
          windowed=True,
          icon=os.path.join(gooey_root, 'images', 'program_icon.ico'))

#coll = COLLECT(exe,
    #a.binaries,
    #a.zipfiles,
    #a.datas,
    #options,
    #gooey_languages, # Add them in to collected files
    #gooey_images, # Same here.
    #name='BOT_Bot_GUI',
    #debug=False,
    #strip=False,
    #upx=True,
    #console=False,
    #windowed=True,
    #icon=os.path.join(gooey_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/目錄。 使用鈎子可以使您免於日后的頭痛。 在此處閱讀有關Pyinstaller的鈎子功能的更多信息。 hooks/目錄中,有一個Scrapy的鈎子文件。 這將告訴Pyinstaller包含許多模塊和文件如果您不使用.spec文件,這些模塊和文件將會丟失 到目前為止,這是我在這里寫的最重要的內容。 如果您不執行此步驟,則每次嘗試運行使用Pyinstaller構建的Scrapy程序時,都將繼續獲取ImportError Scrapy導入了許多Pyinstaller錯過的模塊。

hook-scrapy.py (注意:您的掛鈎文件必須像這樣命名。):

from PyInstaller.utils.hooks import collect_submodules, collect_data_files

# This collects all dynamically imported scrapy modules and data files.
hiddenimports = (collect_submodules('scrapy') +
                 collect_submodules('scrapy.pipelines') +
                 collect_submodules('scrapy.extensions') +
                 collect_submodules('scrapy.utils')
)
datas = collect_data_files('scrapy')

完成編寫適當的build.spec文件后,您需要做的就是在shell提示符下運行Pyinstaller:

pyinstaller build.spec

然后,Pyinstaller應該吐出應該可以正常運行的程序。 問題解決了。

那些Google希望為該問題或Pyinstaller或Scrapy的任何問題提供答案,請祈禱您找到我的答案。

您可以在scrapy包中找到該文件。 轉到以下路徑:Python / Lib / site-packages / scrapy ,您將找到該文件。 以下是您接下來要執行的步驟:

  1. 轉到exe文件所在的目錄,然后創建一個名為scrapy的文件夾。
  2. 從上面的路徑復制VERSIONmime.types (如果您不復制mime.types ,則不會再出現此類文件錯誤。我只是在節省您的時間)
  3. 將這兩個文件粘貼到您在步驟1中創建的scrapy文件夾中。
  4. 現在打開您的exe文件。 如果出現“ 無模塊錯誤” ,則只需要在要使用Pyinstaller的文件中導入相應的模塊。

祝好運。 :)

如何為使用 MTCNN 庫的程序制作 build.spec? pyinstaller 也不認識它

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM