使用 py2app 冻结使用 pdfkit 的 python 脚本时出现问题

Problems when using py2app to freeze a python script which uses pdfkit

我最近使用 pdfkit 创建了一个应用程序,它接受用户输入的关键字并使用该关键字进行各种互联网搜索。然后它使用 pdfkit 生成每个单独搜索的 pdf 文件,并将它们保存到用户定义的目录中。

当我 运行 来自终端的代码时,一切正常,但是当我尝试使用 py2app 冻结脚本时,一切正常,直到实际保存 pdf 时,应用程序绝对没有什么。

我尝试将 pdfkit 和 wkhtmltopdf 都包含在 py2app 用来创建应用程序的 setup.py 文件中,但没有成功,我尝试将它们列在包含部分下,如下所示:

'includes':['requests','pdfkit']

在包部分:

'packages':['requests','pdfkit']

甚至在下面的 setup_requires 部分:

setup_requires=['py2app', 'wkhtmltopdf']

但应用程序仍然没有执行任何操作。我认为这与依赖项不会转移到冻结的应用程序这一事实有关。但是我开始重新考虑这一点,因为即使我以别名模式(声称保留所有依赖项)创建应用程序,也会出现同样的问题。

这是一个已知问题吗?或者有没有人找到解决办法。

非常感谢。我的完整 setup.py 文件如下:

    from setuptools import setup

APP = ['pdtest.py']
DATA_FILES = []
OPTIONS = {'argv_emulation': False, 'includes':['requests','pdfkit'],'packages':['requests','pdfkit'], 'iconfile':'icon.icns'}

setup(
    app=APP,
    data_files=DATA_FILES,
    options={'py2app': OPTIONS},
    setup_requires=['py2app', 'wkhtmltopdf'],
)

好的,找到答案了,任何遇到同样问题的人都可以使用它。

基本上问题在于 pdfkit 只是模块 WKHTMLTOPDF 的包装器。

因此,当您调用 PDFKIT 时,基本上所有发生的事情就是它只要求 WKHTMLTOPDF 为其完成工作,但是由于某种原因,在我的系统上,脚本能够找到 WKHTMLTOPDF 模块时 运行 来自终端,但无法使用 py2app 转换为小程序。

我需要做的是告诉脚本 WKHTMLTOPDF 的确切位置,但首先您需要自己知道该信息,只需在终端中输入:

which wkhtmltopdf

你应该得到一个返回的路径。如果你不这样做,那么也许你应该考虑先安装它,这通常会有所帮助。

然后您需要设置配置文件以在该位置查找 wkhtmltopdf 模块,因此只需将其添加到您的 pdfkit 脚本中即可:

config = pdfkit.configuration(wkhtmltopdf='/usr/local/bin/wkhtmltopdf')

除了将“=”后面的路径替换为之前which命令返回的任何路径。然后,每次调用pdfkit时,都需要添加此配置,例如:

normalpdf = pdfkit.from_url('URL, 'test.pdf',configuration = config)

这应该可以解决问题。希望对您有所帮助!