PyPandoc 结合 PyInstaller

PyPandoc in combination with PyInstaller

我安装了 PyInstaller 来为我的 python 脚本创建可执行文件,并且工作正常。我使用 PyPandoc 创建了 .docx 报告,当正常的 python 文件是 运行 但不是来自 PyInstaller 生成的可执行文件时,它也 运行 很好。它给出了错误:

Traceback (most recent call last):
  File "src\flexmodel_postcalc.py", line 295, in postcalculate_everything
  File "src\flexmodel_postcalc.py", line 281, in generate_report_docx
  File "src\flexmodel_report_docx.py", line 118, in generate_text_useages_docx
  File "pypandoc\__init__.py", line 50, in convert
  File "pypandoc\__init__.py", line 70, in _convert
  File "pypandoc\__init__.py", line 197, in get_pandoc_formats
  File "pypandoc\__init__.py", line 336, in _ensure_pandoc_path
OSError: No pandoc was found: either install pandoc and add it
to your PATH or install pypandoc wheels with included pandoc.

在可执行文件创建过程中,我没有发现任何关于 PyPandoc 的奇怪问题。我如何将 Pandoc 包含到我的可执行文件中,以便其他人(没有安装 Python and/or Pandoc)可以使用可执行文件并创建 .docx 报告?

编辑:工作流程包括以下步骤:

  1. 创建包含以下代码的文件:

    import pypandoc
    pypandoc.convert(sou‌​rce='# Sample title\nPlaceholder', to='docx', format='md', outputfile='test.doc‌​x')
    
  2. 将此文件另存为 pythonfile.py

  3. 使用 PyInstaller 创建可执行文件:

    pyinstaller --onefile --clean pythonfile.py
    
  4. 现在可执行文件应该 运行 在没有安装 Pandoc(或 PyPandoc)的计算机上。

这里有两个问题。第一个是 pypandoc 需要 pandoc.exe 才能工作。这不会由 pyinstaller 自动选取,但您可以手动指定。

要做到这一点,您必须 create a .spec file。我生成并使用的那个看起来像这样:

block_cipher = None

a = Analysis(['pythonfile.py'],
             pathex=['CodeDIR'],
             binaries=[],
             datas=[],
             hiddenimports=[],
             hookspath=[],
             runtime_hooks=[],
             excludes=[],
             win_no_prefer_redirects=False,
             win_private_assemblies=False,
             cipher=block_cipher)
pyz = PYZ(a.pure, a.zipped_data,
             cipher=block_cipher)
exe = EXE(pyz,
          a.scripts,
          a.binaries,
          a.zipfiles,
          a.datas,
          name='EXEName',
          debug=False,
          strip=False,
          upx=True,
          console=True , 
          resources=['YourPandocLocationHere\\pandoc.exe'])

您可以使用 pyinstaller myspec.spec 构建可执行文件。不要忘记更改路径和 name 参数。

如果您在目录模式下构建它,这应该足够了。然而,对于 one-file 模式,由于 pyinstaller bootloader process works. The pandoc.exe file is unzipped during execution in a temporary folder, but the execution happens in your original .exe folder. According to this question 的方式,事情有点复杂,如果你运行 冻结的代码。

if hasattr(sys, '_MEIPASS'):
    os.chdir(sys._MEIPASS)