使用 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)
这应该可以解决问题。希望对您有所帮助!
我最近使用 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)
这应该可以解决问题。希望对您有所帮助!