我可以从命令行运行此命令而不会出现任何问题(验证脚本会执行):
c:/Python27/python ../feedvalidator/feedvalidator/src/demo.py https://das.dynalias.org:8080/das_core/das/2.16.840.1.113883.4.349/1012581676V377802/otherAdminData/careCoordinators
从java,如果我离开URL参数,只是做:
String[] args1 = {"c:/Python27/python", "../feedvalidator/feedvalidator/src/demo.py" }; Runtime r = Runtime.getRuntime(); Process p = r.exec(args1);
它工作正常。如果我对某些参数使用某些URL,例如:
String[] args1 = {"c:/Python27/python", "../feedvalidator/feedvalidator/src/demo.py" , "http://www.intertwingly.net/blog/index.atom"}; // or String[] args1 = {"c:/Python27/python", "../feedvalidator/feedvalidator/src/demo.py" , "http://www.cnn.com"};
它也可以正常工作。
但是,如果我使用这个特定的URL https://das.dynalias.org:8080/das_core/das/2.16.840.1.113883.4.349/1012581676V377802/otherAdminData/careCoordinators,那么脚本只会挂起(java等待过程完成)。我不确定为什么它可以从该URL的命令行运行,而不是从Java程序运行。我尝试添加引号将URL参数括起来,但这也不起作用。我认为URL中没有任何需要转义的字符。
完整代码:
String urlToValidate = "https://das.dynalias.org:8080/das_core/das/2.16.840.1.113883.4.349/1012581676V377802/otherAdminData/careCoordinators"; String[] args1 = {"c:/Python27/python", "C:/Documents and Settings/vhaiswcaldej/DAS_Workspace/feedvalidator/feedvalidator/src/demo.py", urlToValidate }; System.out.println(args1[0] + " " + args1[1] + " " + args1[2]); Runtime r = Runtime.getRuntime(); Process p = r.exec(args1); BufferedReader br = new BufferedReader(new InputStreamReader( p.getInputStream())); int returnCode = p.waitFor(); System.out.println("Python Script or OS Return Code: " + Integer.toString(returnCode)); if (returnCode >= 2) { .out.println("OS Error: Unable to Find File or other OS error."); } String line = ""; while (br.ready()) { String str = br.readLine(); System.out.println(str); if (str.startsWith("line")) { //TODO: Report this error back to test tool. //System.out.println("Error!"); } }
您需要耗尽进程的输出和错误流,否则当执行的程序产生输出时,它将阻塞。
从流程文档中:
由于某些本机平台仅为标准输入和输出流提供了有限的缓冲区大小,因此未能及时写入子流程的输入流或读取子流程的输出流可能导致子流程阻塞甚至死锁。