2

我安装了 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 和/或 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)的计算机上运行。

4

1 回答 1

4

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

为此,您必须创建一个.spec文件。我生成和使用的看起来像这样:

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参数。

如果您在目录模式下构建它,这应该足够了。但是,对于该模式,由于 pyinstaller引导加载程序one-file的工作方式,事情会稍微复杂一些。该文件在执行期间被解压缩到一个临时文件夹中,但执行发生在您的原始文件夹中。根据这个问题,如果您运行冻结的代码,则必须在调用 pypandoc 更改当前文件夹之前将以下行添加到您的代码中。pandoc.exe.exe

if hasattr(sys, '_MEIPASS'):
    os.chdir(sys._MEIPASS)
于 2016-08-15T14:54:48.573 回答