1

我有一个希望导出为 jar 的 Java 项目。导致我出现问题的原因是我从程序内部调用了一些 Python 脚本,而这些脚本需要安装一些 Python 包。我对 python 脚本的调用如下所示:

root = Paths.get(".").toAbsolutePath().normalize().toString();
cmd = "python " + root + "/my_script.py"
Runtime.getRuntime().exec(cmd)

当我运行 jar 时,只要我有 Python 脚本,并且所有 Python 包(加上 Python 本身)都安装在我的计算机上(全局),它就可以正常工作。

不过,我想做的是将所有这些 Python 东西捆绑到我的 jar 中——这样我就可以在任何机器上运行该应用程序(唯一的要求是 Java 8——没有 Python 或其任何包)。我发现virtualenv正是在这里可以完成的工作。

当我在 IDEA 工作时,我决定以 SDK 方式配置 virtualenv,因此按照本教程创建了一个 Virtualenv 环境。在环境的设置中添加了我需要的包,将 my_script.py 放在脚本目录中。最终得到这样的结构:

/
├── src
│   └── main.java
│   └── sample.fxml
└── venv
    ├── include
    │   
    ├── scripts [a bunch of default scripts here + my_script.py]
    └── lib  
          └── site-packages [a bunch of libraries here including the ones I require]   
          └── tcl8.6      

我应该说 Jetbrain 的教程真的需要继续,因为我完全迷失了这里。我只是不知道如何引用 my_script.py 以便它使用来自 venv 的包而不是全局包。

非常感谢您的帮助或提示!

4

2 回答 2

0

虚拟环境仍然需要安装 Python,它只允许您选择使用已安装的 Python 解释器,并允许您安装一组包。

如果您真的不想依赖安装的 Python,您可以使用Jython。它在 JVM 上运行 Python 代码。但是,它只支持 Python 2.7。Python 3 支持正在开发中,但速度很慢。

如果您有很多包依赖项,那么这一切都不是一件容易的事。

于 2019-03-30T18:08:14.530 回答
0

在我看来,venv 不是你的最终解决方案:如果你需要在不同的主机(Windows、linux、MACOS)上使用你的 java 代码,你应该为每台不同的机器重新编译一个 venv,这不是你的情况。也许一个解决方案是“冻结”你的python代码。有很多关于 Python 中代码冻结的有趣文章,我更喜欢python-guide

因此,在代码冻结之后,您可以像可执行文件一样从 java 启动 python 代码,并且可以根据操作系统提供不同的可执行文件。

于 2019-02-03T14:04:31.667 回答