如何在可执行文件中包含带有 pyinstaller 的特定 .jar 文件?

Posted

技术标签:

【中文标题】如何在可执行文件中包含带有 pyinstaller 的特定 .jar 文件?【英文标题】:How to include specific .jar files with pyinstaller in executable file? 【发布时间】:2018-10-05 07:41:01 【问题描述】:

打包为 exe 时如何强制 pyinstaller 使用特定的 .jar 文件?

我正在尝试生成一个使用 tabula-py lib 的可执行文件。这个库需要一个 jar 文件,tabula-1.0.1-jar-with-dependencies.jar,我的 file.py 文件夹中有该文件。以下是 myfile.spec 中的一些修改:

# this is for pandas lib
def get_pandas_path():
    import pandas
    pandas_path = pandas.__path__[0]
    return pandas_path

dict_tree = Tree(get_pandas_path(), prefix='pandas', excludes=["*.pyc"])
a.datas += dict_tree
a.binaries = filter(lambda x: 'pandas' not in x[0], a.binaries)

# this is for tabula-py
jar = 'tabula-1.0.1-jar-with-dependencies'
jar_path = 'C:\\Users\\jaquedeveloper\\Documents\\freelancer\\bot\\' + jar
coll = COLLECT(exe,
       a.binaries,
       a.zipfiles,
       a.datas,
       [(jar, jar_path, 'PKG')],
       strip=None,
       upx=True,
       name='test')

不过,错误仍然存​​在。 当我从命令行运行我的代码时,使用 java jar 的 tabula-py 中的函数 read_pdf() 可以正常工作。

但是当我使用 pyinstaller spec 命令生成可执行文件时,它无法执行此功能,并给出以下错误:

无法访问 jarfile C:\Users\jaquedeveloper\AppData\Local\Temp_MEI58442\tabula\tabula-1.0.1-jar-with-dependencies.jar

该文件不在此文件夹下,tabula 文件夹也不存在。 我在可执行文件的同一文件夹下有文件。如何强制脚本使用它? 如何将 jar 从特定路径导入可执行文件,而不是使用 _MEI 文件夹?

here也报告了这个问题。

【问题讨论】:

嗨,杰奎琳。你有没有运气找到这个问题的答案?我也有类似的问题。 不走运,由于客户请求,我最终没有开发该功能,并且没有做任何事情,因为他们......我已经生成了一个 exe,但没有使用 tabula,因为没有更多必要过滤pdf文件。 好的。谢谢你让我知道。我最终使用 Camelot-py 而不是 Tabula 重写了我的程序,这样没有管理员权限的用户可以在没有 Java 的情况下运行它。 【参考方案1】:

不久前我偶然发现了这个线程,因为我遇到了完全相同的问题。使用 pyinstaller 将 .jar 文件添加到“onefile”可执行文件似乎会将其放置在错误的临时目录中 - 在 ...AppData\Local\Temp_MEI58442\ tabula \tabula-1.0.1-jar-与-dependencies.jar。 添加的文件似乎放在 ...AppData\Local\Temp_MEI58442\tabula-1.0.1-jar-with-dependencies.jar 中。这就是为什么执行 tabula.read_pdf() 命令时找不到它的原因。 作为一种解决方法,我使用 pyinstaller(而不是 onefile)生成了一个 onedir 输出,并使用 jar 文件添加了一个目录“tabula”,并且它起作用了。

将其捆绑到一个文件中也可以: 它实际上都在 pyinstaller 文档 (https://pyinstaller.readthedocs.io/en/stable/usage.html) 中。添加二进制 .jar 文件时,您可以在 ':' for Linux 和 ';' 之后指定临时文件夹内文件的相对路径为 Win 系统。仅使用“。”作为路径将文件放在 ./Temp_MEI*/ 下。所以在我的 Win 案例中,它看起来像这样:

pyinstaller --onefile --add-binary "C:/Users/Louis/Desktop/Github/pdf_reader/venv/Lib/site-packages/tabula/tabula-1.0.2-jar-with-dependencies.jar;./tabula/" myapp.py

这个解决方案来得有点晚,但我希望它仍然对某人有所帮助。

【讨论】:

谢谢,我使用了相同的解决方案,并没有在此处记录。它肯定会帮助某人。

以上是关于如何在可执行文件中包含带有 pyinstaller 的特定 .jar 文件?的主要内容,如果未能解决你的问题,请参考以下文章

在可执行的 .jar 文件中包含 excel

使用 Maven 在可执行 JAR 中包含签名库

在可分发的 Python 模块中包含 pdftk

如何在python安装包中包含文本文件?

Pyinstaller 的综合教程? [关闭]

如何在网站上的所有页面中包含带有 css 的模板