我安装了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
报告?
编辑:一个工作过程包括以下步骤:
创建一个包含以下代码的文件:
import pypandoc pypandoc.convert(source='# Sample titlenPlaceholder', to='docx', format='md', outputfile='test.docx')
另存为
pythonfile.py
用PyInstaller创建可执行文件:
pyinstaller --onefile --clean pythonfile.py
现在可执行文件应该在没有安装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)