【发布时间】:2012-01-25 14:45:23
【问题描述】:
我可以毫无问题地从命令行运行这个命令(验证脚本执行):
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
如果我不使用 URL 参数并从 java 中执行以下操作:
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!");
}
}
【问题讨论】:
-
也许当前目录很重要?您可以尝试在命令行中切换到另一个目录。
-
您应该检查从 Java 执行的实际命令行,在 Linux -
ps f,在 Win - sysinternals ProcessExplorer -
这可能是一些 ssl 问题。你可以尝试调用一个http端点来验证它吗?
-
你是在创建进程后调用Process的p.waitFor()方法吗? exec 应该是非阻塞的,因此如果没有调用 waitFor,您可能会在代码的其他地方锁定,因为创建的进程尚未完成执行
-
试试用双引号,比如
String[] args1 = {"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