【问题标题】:Using Java PrcoessBuilder to run Python remote file使用 Java PrcoessBuilder 运行 Python 远程文件
【发布时间】:2019-01-19 06:46:11
【问题描述】:

我正在尝试使用带有以下代码的 java Process builder 执行 python 文件(远程)。

 List<String> commands = new ArrayList<String>();
 commands.add("/bin/sh");
 commands.add("-c");
 commands.add("\"python <(curl <remote python file>\"");

 ProcessBuilder builder = new ProcessBuilder(commands);
 builder.redirectErrorStream(true);

及其给予

/bin/sh: python

尝试使用命令插值(curl 和 python 命令前面的 $ 没有用双引号括起来)

 commands.add("/bin/sh");
 commands.add("-c");
 commands.add("python <$(curl <remote python file>)");

这是在扔

不明确的重定向错误

【问题讨论】:

  • 内插版本缺少右括号
  • 我推测它正在尝试将“python ”作为单个命令执行(而不是将命令作为带参数的命令),我会分开并使用“” 作为单独的命令
  • 我对右括号不好(它的复制/粘贴问题)
  • 单独的命令意味着下载文件到本地然后运行python?恐怕在我的情况下这可能是不可能的。这是一个框架,用户提供一串命令,Java 代码执行它们(任何 shell 命令)

标签: java processbuilder


【解决方案1】:

Java 几乎可以做curl 可以做的所有事情。只需下载带有代码的文件:

URL remotePythonFile = new URL("http://example.com/remotefile.py");
Path localPythonFile = Files.createTempfile(null, ".py");
try (InputStream remoteStream = remotePythonFile.openStream()) {
    Files.copy(remoteStream, localPythonFile,
        StandardCopyOption.REPLACE_EXISTING);
}

ProcessBuilder builder =
    new ProcessBuilder("python", localPythonFile.toString());

【讨论】:

  • 很遗憾,这不是我们的选择。上面的代码 sn-p 正在从外部源获取动态 List (commands),它可以有任何有效的 shell 命令。
猜你喜欢
  • 2011-06-12
  • 1970-01-01
  • 1970-01-01
  • 2018-05-27
  • 2015-06-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多