我在Java中使用Jython;所以我有一个类似于下面的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'在命令行上运行它们。)
答案 0 :(得分:9)
我正在使用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']
答案 1 :(得分:0)
对于上述解决方案不起作用的人,请尝试以下方法。这适用于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 https://azure.microsoft.com/en-us/documentation/articles/cloud-services-nodejs-develop-deploy-app/ -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);