PyPandoc与PyInstaller结合使用



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

Traceback (most recent call last):
  File "srcflexmodel_postcalc.py", line 295, in postcalculate_everything
  File "srcflexmodel_postcalc.py", line 281, in generate_report_docx
  File "srcflexmodel_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 titlenPlaceholder', 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自动拾取,但您可以手动指定。

要做到这一点,你必须创建一个.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参数。

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

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

相关内容

  • 没有找到相关文章

最新更新