带有通配符的子进程popen参数

时间:2017-07-16 06:14:27

标签: python python-2.7 docker

我写了一个定义如下的方法并且工作

HttpServer server = HttpServer.create(new InetSocketAddress(1234), 0);

server.createContext("/favicon.ico", t -> {
  byte[] bytes = Files.readAllBytes(Paths.get("/path/to/favicon"));
  t.sendResponseHeaders(200, bytes.length);
  try (OutputStream os = t.getResponseBody()) {
    os.write(bytes);
  }
});

server.createContext("/", t -> {
  Charset charset = StandardCharsets.UTF_8;
  List<String> lines = Files.readAllLines(Paths.get("/path/to/index"), charset);

  t.sendResponseHeaders(200, 0);

  try (OutputStream os = t.getResponseBody()) {
    for (String line : lines) {
      os.write((line + "\n").getBytes(charset));
    }
  }
});

server.start();

我的常量为def cmd_exec(cmd_tokens = []): p = subprocess.Popen(cmd_tokens, stdout=subprocess.PIPE,stderr=subprocess.PIPE) out, err = p.communicate() return (out, err)

当我以LOAD_IMAGES=['docker', 'load', '-i', 'my_img_file_101']作为参数执行上述方法时,它可以正常工作。但是,文件名号可能会改变,当我尝试使用通配符时,我收到错误。当我有LOAD_IMAGES时,我从Py / Bash收到错误LOAD_IMAGES=['docker', 'load', '-i', 'my_img_file*']

如何使外卡工作。直接在bash上执行命令。我的意思是当我在bash上说这个时,它有效open my_img_file*: no such file or directory

1 个答案:

答案 0 :(得分:3)

通配符扩展是bash在shell中处理的事情。它不是内置于Linux / Unix中的能够扩展通配符或任何语法的东西。所以你需要明确它并手动进行扩展。

的另一种选择,它实际上让shell通过shell=True完成所有工作。正如问题所述,它有其缺点。引用:

  

这是一件好事,请参阅&#34;频繁使用的参数中的警告块&#34;子流程文档的部分。它主要讨论安全问题,但也可以帮助避免愚蠢的编程错误(因为没有魔术shell字符需要担心)

     

我对shell = True的主要抱怨是它通常意味着有一个更好的方法来解决这个问题 - 在你的例子中,你应该使用glob模块......