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