簡體   English   中英

pyfiglet軟件包的PyInstaller缺少模塊錯誤

[英]PyInstaller Missing Module Error with pyfiglet package

我想構建一個獨立的可執行VLI工具,該工具將使用pyfiglet軟件包。 當我運行pyinstaller --onefile main.py時,在build/warn-main.txt文件中導致了一些警告。

我更改了生成的main.spec,添加了"pyfiglet.fonts"和其他一些缺少的模塊,然后執行pyinstaller --onefile main.spec 之后,僅pyfiglet.fonts被“解決”。

最初我在Windows 10 Pro中運行代碼,但是由於找不到解決方案,我使用Linux和python安裝了一個干凈的VM,僅用於測試...

我正在使用以下軟件進行干凈的ubuntu 19.04安裝:-從默認存儲庫安裝python3(3.7.3)-沒有虛擬環境-已添加-已安裝pyinstaller(3.5),就像pip install pyinstaller簡單

有了這個非常基本的代碼,問題就發生了

import pyfiglet
print("Basic Work...")
ascii_banner = pyfiglet.figlet_format("Works...")
print(ascii_banner)

缺少的模塊是:

missing module named pyimod03_importers - imported by /home/masterlocal/.local/lib/python3.7/site-packages/PyInstaller/loader/rthooks/pyi_rth_pkgres.py (top-level)
missing module named _winreg - imported by platform (delayed, optional), /home/masterlocal/code/cliexe/main.py (top-level), pkg_resources._vendor.appdirs (delayed, conditional)
missing module named java - imported by platform (delayed), /home/masterlocal/code/cliexe/main.py (top-level)
missing module named 'java.lang' - imported by platform (delayed, optional), /home/masterlocal/code/cliexe/main.py (top-level), xml.sax._exceptions (conditional)
missing module named vms_lib - imported by platform (delayed, conditional, optional), /home/masterlocal/code/cliexe/main.py (top-level)
missing module named _scproxy - imported by urllib.request (conditional)
missing module named org - imported by pickle (optional), /home/masterlocal/code/cliexe/main.py (top-level)
missing module named msvcrt - imported by subprocess (conditional), click._compat (conditional, optional), click._winconsole (top-level), getpass (optional), click._termui_impl (conditional), /home/masterlocal/code/cliexe/main.py (top-level)
missing module named _winapi - imported by encodings (delayed, conditional, optional), subprocess (conditional), /home/masterlocal/code/cliexe/main.py (top-level)
missing module named winreg - imported by platform (delayed, optional), mimetypes (optional), /home/masterlocal/code/cliexe/main.py (top-level), urllib.request (delayed, conditional, optional), pkg_resources._vendor.appdirs (delayed, conditional)
missing module named pkg_resources.extern.six - imported by pkg_resources.extern (top-level), pkg_resources (top-level), pkg_resources.py31compat (top-level), /home/masterlocal/code/cliexe/main.py (top-level)
missing module named 'pkg_resources.extern.six.moves' - imported by pkg_resources (top-level), /home/masterlocal/code/cliexe/main.py (top-level), pkg_resources._vendor.packaging.requirements (top-level)
missing module named pkg_resources.extern.appdirs - imported by pkg_resources.extern (top-level), pkg_resources (top-level), /home/masterlocal/code/cliexe/main.py (top-level)
missing module named pkg_resources.extern.packaging - imported by pkg_resources.extern (top-level), pkg_resources (top-level), /home/masterlocal/code/cliexe/main.py (top-level)
missing module named __main__ - imported by pkg_resources (delayed, optional), /home/masterlocal/code/cliexe/main.py (top-level)
missing module named 'pkg_resources.extern.pyparsing' - imported by pkg_resources._vendor.packaging.requirements (top-level), pkg_resources._vendor.packaging.markers (top-level)
missing module named 'ctypes.macholib' - imported by ctypes.util (conditional)
missing module named netbios - imported by uuid (delayed)
missing module named win32wnet - imported by uuid (delayed)
missing module named __builtin__ - imported by pkg_resources._vendor.pyparsing (conditional)
missing module named ordereddict - imported by pkg_resources._vendor.pyparsing (optional)
missing module named 'win32com.shell' - imported by pkg_resources._vendor.appdirs (conditional, optional)
missing module named 'com.sun' - imported by pkg_resources._vendor.appdirs (delayed, conditional, optional)
missing module named com - imported by pkg_resources._vendor.appdirs (delayed)
missing module named win32api - imported by pkg_resources._vendor.appdirs (delayed, conditional, optional)
missing module named win32com - imported by pkg_resources._vendor.appdirs (delayed)
missing module named StringIO - imported by pkg_resources._vendor.six (conditional)
missing module named nt - imported by os (conditional, optional), ntpath (conditional, optional), shutil (conditional), /home/masterlocal/code/cliexe/main.py (top-level)
excluded module named _frozen_importlib - imported by importlib (optional), importlib.abc (optional), /home/masterlocal/code/cliexe/main.py (top-level)
missing module named _frozen_importlib_external - imported by importlib._bootstrap (delayed), importlib (optional), importlib.abc (optional), /home/masterlocal/code/cliexe/main.py (top-level)
missing module named 'org.python' - imported by copy (optional), /home/masterlocal/code/cliexe/main.py (top-level), xml.sax (delayed, conditional)
missing module named colorama - imported by click._compat (conditional, optional)

我是Python的新手,所以沒有太多的經驗,但是根據我讀過的很多文章,並沒有太多的細節。 我已經檢查了有關如何安裝和重新查詢的文檔,所有內容(不多)均符合預期。

我將不勝感激任何幫助。

PyInstaller不會識別具有外部依賴關系的庫,例如模板,DLL等。因此,如果要凍結這樣的模塊,則需要手動將其提供給最終的可執行文件。

pyfiglet需要其外部font依賴性,因此您可以通過add-data標志添加它。 例如:

pyinstaller -F --add-data "<python directory>/Lib/site-packages/pyfiglet/fonts;./pyfiglet/fonts" script.py

上面的命令將解決在Windows上導入pyfiglet問題。 另外,我建議您始終將virtualenv與PyInstaller一起使用,因為它會創建新的Python環境。

如果我看好,問題在於在pyfiglet中加載字體的pyfiglet

我建議將其替換為自定義:

import pyfiglet
import pyfiglet.fonts
import pkg_resources
import os

class MyFigletFont(pyfiglet.FigletFont):
    @classmethod
    def preloadFont(cls, font):
        """
        Load font data if exist
        """
        base_path = os.path.dirname(pyfiglet.fonts.__file__)
        for extension in ('tlf', 'flf'):
            fn = '%s.%s' % (font, extension)
            """
               I chnage theese 3 lines.
               original use pkg_resources.resource_exists
            """  
            if os.path.isfile(os.path.join(base_path, fn)):
                with open(os.path.join(base_path, fn), 'rb') as f:
                    return f.read().decode('UTF-8', 'replace')
            else:
                for location in ("./", pyfiglet.SHARED_DIRECTORY):
                    full_name = os.path.join(location, fn)
                    if os.path.isfile(full_name):
                        with open(full_name, 'rb') as f:
                            return f.read().decode('UTF-8', 'replace')
        else:
            raise FontNotFound(font)

pyfiglet.FigletFont = MyFigletFont # here I change implementation of font loader 

print("Basic Work...")
ascii_banner = pyfiglet.figlet_format("Works...")
print(ascii_banner)

和規格文件(記住要更新路徑)

# -*- mode: python ; coding: utf-8 -*-

block_cipher = None
import os 
import pyfiglet.fonts

a = Analysis(['test3.py'],
             pathex=['/home/czaki/Pobrane/tmp/test_pyqt'],
             binaries=[],
             datas=[(os.path.join(os.path.dirname(pyfiglet.fonts.__file__), "*.f*"), os.path.join("pyfiglet", "fonts"))],
             hiddenimports=["pyfiglet.fonts"],
             hookspath=[],
             runtime_hooks=[],
             excludes=[],
             win_no_prefer_redirects=False,
             win_private_assemblies=False,
             cipher=block_cipher,
             noarchive=False)
pyz = PYZ(a.pure, a.zipped_data,
             cipher=block_cipher)
exe = EXE(pyz,
          a.scripts,
          [],
          exclude_binaries=True,
          name='test3',
          debug=False,
          bootloader_ignore_signals=False,
          strip=False,
          upx=True,
          console=True )
coll = COLLECT(exe,
               a.binaries,
               a.zipfiles,
               a.datas,
               strip=False,
               upx=True,
               upx_exclude=[],
               name='test3')

暫無
暫無

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

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