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').
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
list в объекте состояния изначально имеет длину 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']
Для тех людей, у которых вышеуказанное решение не работает, попробуйте следующее. Это работает для меня на версии 2.7.0 Jython
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);