PyInstaller不包含依赖文件

问题描述 投票:3回答:2

我正在尝试在我的project中创建一个使用PyInstaller。

这个项目使用weasyprint,但是当我运行pyinstaller时,它失败了,因为weasyprint的资源文件似乎没有被安装。

Traceback (most recent call last):
  File "<string>", line 20, in <module>
  File "<frozen importlib._bootstrap>", line 2214, in _find_and_load
  File "<frozen importlib._bootstrap>", line 2203, in _find_and_load_unlocked
  File "<frozen importlib._bootstrap>", line 1191, in _load_unlocked
  File "<frozen importlib._bootstrap>", line 1161, in _load_backward_compatible
  File "/usr/local/lib/python3.4/dist-packages/PyInstaller-3.0dev_be553f0-py3.4.egg/PyInstaller/loader/pyi_importers.py", line 302, in load_module
    exec(bytecode, module.__dict__)
  File "/usr/local/lib/python3.4/dist-packages/mdedit-1.0.1-py3.4.egg/mdedit/editor/mdeditor.py", line 13, in <module>
    from mdedit.generator import *
  File "<frozen importlib._bootstrap>", line 2214, in _find_and_load
  File "<frozen importlib._bootstrap>", line 2203, in _find_and_load_unlocked
  File "<frozen importlib._bootstrap>", line 1191, in _load_unlocked
  File "<frozen importlib._bootstrap>", line 1161, in _load_backward_compatible
  File "/usr/local/lib/python3.4/dist-packages/PyInstaller-3.0dev_be553f0-py3.4.egg/PyInstaller/loader/pyi_importers.py", line 302, in load_module
    exec(bytecode, module.__dict__)
  File "/usr/local/lib/python3.4/dist-packages/mdedit-1.0.1-py3.4.egg/mdedit/generator.py", line 13, in <module>
    from weasyprint import HTML, CSS
  File "<frozen importlib._bootstrap>", line 2214, in _find_and_load
  File "<frozen importlib._bootstrap>", line 2203, in _find_and_load_unlocked
  File "<frozen importlib._bootstrap>", line 1191, in _load_unlocked
  File "<frozen importlib._bootstrap>", line 1161, in _load_backward_compatible
  File "/usr/local/lib/python3.4/dist-packages/PyInstaller-3.0dev_be553f0-py3.4.egg/PyInstaller/loader/pyi_importers.py", line 302, in load_module
    exec(bytecode, module.__dict__)
  File "/usr/local/lib/python3.4/dist-packages/weasyprint/__init__.py", line 337, in <module>
    from .html import find_base_url, HTML5_UA_STYLESHEET, get_html_metadata
  File "<frozen importlib._bootstrap>", line 2214, in _find_and_load
  File "<frozen importlib._bootstrap>", line 2203, in _find_and_load_unlocked
  File "<frozen importlib._bootstrap>", line 1191, in _load_unlocked
  File "<frozen importlib._bootstrap>", line 1161, in _load_backward_compatible
  File "/usr/local/lib/python3.4/dist-packages/PyInstaller-3.0dev_be553f0-py3.4.egg/PyInstaller/loader/pyi_importers.py", line 302, in load_module
    exec(bytecode, module.__dict__)
  File "/usr/local/lib/python3.4/dist-packages/weasyprint/html.py", line 37, in <module>
    filename=os.path.join(os.path.dirname(__file__), 'css', 'html5_ua.css'))
  File "/usr/local/lib/python3.4/dist-packages/weasyprint/__init__.py", line 223, in __init__
    with result as (source_type, source, base_url, protocol_encoding):
  File "/usr/lib/python3.4/contextlib.py", line 59, in __enter__
    return next(self.gen)
  File "/usr/local/lib/python3.4/dist-packages/weasyprint/__init__.py", line 294, in _select_source
    with open(filename, 'rb') as file_obj:
FileNotFoundError: [Errno 2] No such file or directory: '/home/sylvain/git/md-edit/dist/MdEditor/weasyprint/css/html5_ua.css'

有没有办法强制pyinstaller包括这个文件?

我可以自己加一下吗?

命令:pyinstaller mainwindow.spec

mainwindow.spec:

# -*- mode: python -*-
a = Analysis(['mdedit/mainwindow.py'],
             pathex=['/home/sylvain/git/md-edit'],
             hiddenimports=[],
             hookspath=None,
             runtime_hooks=None)
pyz = PYZ(a.pure)
exe = EXE(pyz,
          a.scripts,
          exclude_binaries=True,
          name='mainwindow',
          debug=False,
          strip=None,
          upx=True,
          console=True )
coll = COLLECT(exe,
               a.binaries,
               a.zipfiles,
               a.datas,
               strip=None,
               upx=True,
               name='MdEditor')

提前致谢。

python-3.x pyinstaller
2个回答
3
投票

我有一个类似的问题,可能是同一个问题,并按如下方式解决。希望这对你有用:

# -*- mode: python -*-

from PyInstaller.utils.hooks import collect_data_files

w = collect_data_files('weasyprint')
ww = []
for k,v in w:
    ww.append((k, v.split('weasyprint/')[1]))
added_files += ww
added_files += collect_data_files('pyphen')
extra_imports = ['pyphen', 'weasyprint']

a = Analysis(['mdedit/mainwindow.py'],
             pathex=['/home/sylvain/git/md-edit'],
             datas=added_files,
             hiddenimports=extra_imports,
             hiddenimports=[],
             hookspath=None,
             runtime_hooks=None)
pyz = PYZ(a.pure)
exe = EXE(pyz,
          a.scripts,
          exclude_binaries=True,
          name='mainwindow',
          debug=False,
          strip=None,
          upx=True,
          console=True )
coll = COLLECT(exe,
               a.binaries,
               a.zipfiles,
               a.datas,
               strip=None,
               upx=True,
               name='MdEditor')

0
投票

我在weasyprint面临着类似的问题,并且能够使用@Schwolop的答案进行一些修改,因为我收到'tinycss2'的错误。这是我的spec文件的第一部分:

w = collect_data_files('weasyprint')
tinycss = collect_data_files('tinycss2')

ww = []
counter = 0
for k,v in w:
    if counter == 0:
        ww.append((k, '.'))
        counter += 1
    else:
        ww.append((k, v.split('weasyprint/')[1]))

tcss = []
counter = 0
for k,v in tinycss:
    if counter == 0:
        tcss.append((k, '.'))
        counter += 1
    else:
        tcss.append((k, v.split('tinycss2/')[1]))

added_files = ww
added_files += collect_data_files('tinycss2')
added_files += collect_data_files('cairocffi')
added_files += collect_data_files('pyphen')
added_files.extend(more_data)
extra_imports = ['tinycss2', 'cairocffi', 'pyphen', 'weasyprint']
© www.soinside.com 2019 - 2024. All rights reserved.