Лучшие современные методы распространения ваших файлов Python в банке подробно описаны в этой статье на вики Jython: http://wiki.python.org/jython/JythonFaq/DistributingJythonScripts
В вашем случае, я думаю, вы захотите взять файл jython.jar, который вы получите при установке Jython и заархивировать в него каталог Jython Lib, затем сжать ваши файлы .py и добавить __run__.py
файл с логикой запуска (этот файл обрабатывается Jython специально, и он будет выполняться при вызове jar с помощью "java -jar").
Этот процесс определенно более сложный, чем должен, и поэтому нам (разработчикам Jython) нужно придумать хороший инструмент, который автоматизирует эти задачи, но на данный момент это лучшие методы. Ниже я копирую рецепт внизу вышеприведенной статьи (слегка измененный в соответствии с описанием вашей проблемы), чтобы дать вам представление о решении.
Создание основной банки:
$ cd $JYTHON_HOME
$ cp jython.jar jythonlib.jar
$ zip -r jythonlib.jar Lib
Добавить другие модули в банку:
$ 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
Или, если вы добавили сценарий запуска в банку, используйте одно из следующих действий:
$ 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
Двойной сосуд раздражает, поэтому, если вы хотите избежать этого и получить более приятное:
$ java -jar myapp.jar arg1
Вам придется проделать немного больше работы, пока мы не получим нечто подобное в будущем Jython [Обновление: JarRunner является частью Jython 2.5.1]. Вот некоторый код Java, который автоматически ищет __run__.py
и запускает его. Обратите внимание, что это моя первая попытка в этом классе. Дайте мне знать, если это нужно улучшить!
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), вызвав jar в каталоге "org", вы получите полный путь к вашему файлу. баночка.
$ jar uf org
Добавьте это в файл, который вы будете использовать для обновления манифеста, хорошее имя - manifest.txt:
Main-Class: org.python.util.JarRunner
Затем обновите манифест банки:
$ jar ufm myapp.jar manifest.txt
Теперь вы сможете запускать свое приложение так:
$ java -jar myapp.jar