Jython 2.5.1: вызов из Java в __main__ — как передать аргументы командной строки?

Я использую Jython из Java; поэтому у меня есть настройка Java, подобная приведенной ниже:

String scriptname="com/blah/myscript.py"
PythonInterpreter interpreter = new PythonInterpreter(null, new PySystemState());
InputStream is = this.getClass().getClassLoader().getResourceAsStream(scriptname);
interpreter.execfile(is);

И это (например) запустит скрипт ниже:

# myscript.py:
import sys

if __name__=="__main__":
    print "hello"
    print sys.argv

Как передать аргументы «командной строки» с помощью этого метода? (Я хочу иметь возможность писать свои сценарии Jython, чтобы я также мог запускать их в командной строке с помощью «python script arg1 arg2»).


person monojohnny    schedule 24.06.2011    source источник


Ответы (2)


Я использую Jython 2.5.2, а runScript не существовало, поэтому мне пришлось заменить его на execfile. Помимо этой разницы, мне также нужно было установить argv в объекте состояния перед созданием объекта PythonInterpreter:

String scriptname = "myscript.py";

PySystemState state = new PySystemState();
state.argv.append (new PyString ("arg1"));
state.argv.append (new PyString ("arg2"));

PythonInterpreter interpreter = new PythonInterpreter(null, state);
InputStream is = Tester.class.getClassLoader().getResourceAsStream(scriptname);
interpreter.execfile (is);

Список argv в объекте состояния изначально имеет длину 1 с пустой строкой в ​​нем, поэтому предыдущий код приводит к выводу:

hello
['', 'arg1', 'arg2']

Если вам нужно, чтобы argv[0] было фактическим именем скрипта, вам нужно создать состояние следующим образом:

PySystemState state = new PySystemState();
state.argv.clear ();
state.argv.append (new PyString (scriptname));      
state.argv.append (new PyString ("arg1"));
state.argv.append (new PyString ("arg2"));

Тогда вывод:

hello
['myscript.py', 'arg1', 'arg2']
person 101100    schedule 28.06.2011
comment
хороший - мне просто нужно проверить это с моим выпуском Jython (на самом деле 2.5.1 .. не 2.5 - извинения); Я отмечу как принятое как можно скорее. Ваше здоровье - person monojohnny; 29.06.2011
comment
Также: моим методом был «runScript» - я обернул класс в свой код - я исправил исходный пост, чтобы использовать «execfile» - person monojohnny; 29.06.2011
comment
Да, работает удовольствие; заметил, что существует задокументированный метод для получения systemState, но, похоже, его нет в моем дистрибутиве: jython.org/javadoc/org/python/util/ - спасибо за принятый ответ. - person monojohnny; 29.06.2011

Для тех людей, у кого вышеуказанное решение не работает, попробуйте следующее. Это работает для меня на jython версии 2.7.0

String[] params = {"get_AD_accounts.py","-server", "http://xxxxx:8080","-verbose", "-logLevel", "CRITICAL"};

Приведенная выше команда повторяет приведенную ниже команду. т.е. каждый аргумент и его значение являются отдельными элементами массива params.

jython get_AD_accounts.py -logLevel CRITICAL -server http://xxxxxx:8080 -verbose

PythonInterpreter.initialize(System.getProperties(), System.getProperties(), params);

PySystemState state = new PySystemState() ;

InputStream is = new FileInputStream("C:\\projectfolder\\get_AD_accounts.py");
            PythonInterpreter interp = new PythonInterpreter(null, state);

PythonInterpreter interp = new PythonInterpreter(null, state);
interp.execfile(is);
person kishor    schedule 09.09.2015