gpt4 book ai didi

python - 使用 Jython 将我的 Python 脚本作为 JAR 文件分发?

转载 作者:IT老高 更新时间:2023-10-28 20:25:01 25 4
gpt4 key购买 nike

我已经做了将近两年的 Python 程序员,我习惯于编写小脚本来自动化一些我必须在办公室完成的重复性任务。现在,显然我的同事注意到了这一点,他们也想要这些脚本。

其中一些拥有 Mac,一些拥有 Windows;我在 window 上做的。我调查了使用 py2exe 甚至 py2app 来制作我的脚本的本地人的可能性,但他们从来没有让我满意......

我知道他们所有的系统上都有 JVM,所以我可以给他们一个我的脚本的可执行 JAR 文件,使用类似 Jython 的东西吗?

这有多可行...我的意思是,我不知道如何为 Jython 编写脚本,我在编写它们时也没有在意...它会带来什么样的问题?

最佳答案

在 Jython 的 wiki 上的这篇文章中详细介绍了在 jar 中分发 Python 文件的当前最佳技术:http://wiki.python.org/jython/JythonFaq/DistributingJythonScripts

对于您的情况,我认为您需要获取安装 Jython 时获得的 jython.jar 文件并将 Jython Lib 目录压缩到其中,然后将 .py 文件压缩到其中,然后添加 __run__.py 文件,包含您的启动逻辑(此文件由 Jython 特殊处理,当您使用“java -jar”调用 jar 时将执行该文件)。

这个过程肯定比应该的要复杂,因此我们(Jython 开发人员)需要想出一个很好的工具来自动化这些任务,但目前这些是最好的方法。下面我将复制上述文章底部的配方(稍作修改以适合您的问题描述),让您了解解决方案。

创建基本jar:

$ cd $JYTHON_HOME
$ cp jython.jar jythonlib.jar
$ zip -r jythonlib.jar Lib

将其他模块添加到 jar 中:

$ cd $MY_APP_DIRECTORY
$ cp $JYTHON_HOME/jythonlib.jar myapp.jar
$ zip myapp.jar Lib/showobjs.py
# Add path to additional jar file.
$ jar ufm myapp.jar othermanifest.mf

添加 __run__.py 模块:

# Copy or rename your start-up script, removing the "__name__  == '__main__'" check.
$ cp mymainscript.py __run__.py
# Add your start-up script (__run__.py) to the jar.
$ zip myapp.jar __run__.py
# Add path to main jar to the CLASSPATH environment variable.
$ export CLASSPATH=/path/to/my/app/myapp.jar:$CLASSPATH

在 MS Windows 上,设置 CLASSPATH 环境变量的最后一行看起来像这样:

set CLASSPATH=C:\path\to\my\app\myapp.jar;%CLASSPATH%

或者,再次在 MS Windows 上,使用控制面板和系统属性来设置 CLASSPATH 环境变量。

运行应用程序:

$ java -jar myapp.jar mymainscript.py arg1 arg2

或者,如果您已将启动脚本添加到 jar 中,请使用以下方法之一:

$ java org.python.util.jython -jar myapp.jar arg1 arg2
$ java -cp myapp.jar org.python.util.jython -jar myapp.jar arg1 arg2
$ java -jar myapp.jar -jar myapp.jar arg1 arg2

双 jar 有点烦人,所以如果你想避免这种情况并获得更令人愉悦的体验:

$ java -jar myapp.jar arg1

在我们将类似的东西引入 future 的 Jython [更新:JarRunner 是 Jython 2.5.1 的一部分]之前,您必须做更多的工作。下面是一些自动查找 __run__.py 并运行它的 Java 代码。请注意,这是我第一次尝试这门课。如果需要改进,请告诉我!

package org.python.util;

import org.python.core.imp;
import org.python.core.PySystemState;

public class JarRunner {

public static void run(String[] args) {
final String runner = "__run__";
String[] argv = new String[args.length + 1];
argv[0] = runner;
System.arraycopy(args, 0, argv, 1, args.length);
PySystemState.initialize(PySystemState.getBaseProperties(), null, argv);
imp.load(runner);
}

public static void main(String[] args) {
run(args);
}
}

我将此代码放入 org.python.util 包中,因为如果我们决定将它包含在未来的 Jython 中,它会放在那里。要编译它,您需要将 jython.jar(或您的 myapp.jar)放入类路径中,例如:

$ javac -classpath myapp.jar org/python/util/JarRunner.java

然后你需要将 JarRunner.class 添加到你的 jar 中(类文件需要在 org/python/util/JarRunner.class 中)在“org”目录中调用 jar 将获得整个路径到你的 jar 。

$ jar uf org

将此添加到您将用于更新 list 的文件中,一个好名字是 manifest.txt:

Main-Class: org.python.util.JarRunner

然后更新 jar 的 list :

$ jar ufm myapp.jar manifest.txt

现在您应该可以像这样运行您的应用了:

$ java -jar myapp.jar

关于python - 使用 Jython 将我的 Python 脚本作为 JAR 文件分发?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1252965/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com