我有一个Java项目,我希望将其导出为jar。导致这个问题的原因是我从程序内部调用了一些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,因此在this tutorial之后创建了一个Virtualenv环境。在环境设置中添加了我需要的软件包,将my_script.py放在scripts目录中。结束了这样的结构:
/
├── 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而不是全局的包。
我非常感谢你的帮助或提示!
在我看来,venv不是你的最终解决方案:如果你需要在不同的主机(Windows,Linux,MACOS)上使用你的java代码,你应该为每台不同的机器重新编译一个venv,这不是你的情况。也许解决方案是“冻结”你的python代码。有很多关于Python中代码冻结的有趣文章,我首选的是python-guide。
因此,在冻结代码之后,您可以像执行可执行文件一样从java启动python代码,并且可以根据操作系统提供不同的可执行文件。