【问题标题】:Python3.5 subprocess run cat command without using shellPython3.5子进程不使用shell运行cat命令
【发布时间】:2018-09-05 21:36:25
【问题描述】:

我正在运行cat 命令以使用subprocess.run() 读取Linux 版本。但是它不起作用,错误是:cat: '/etc/*-release': No such file or directory,由于安全原因,我不能使用shell=True。任何提示如何解决这个问题表示赞赏。 这是我的代码:

try:
    result = subprocess.run(
        shlex.split("cat /etc/*-release"),
        stdout=subprocess.PIPE,
        stderr=subprocess.PIPE,
        universal_newlines=True)
except subprocess.TimeoutExpired as err:
    result = err

【问题讨论】:

  • 使用cat 有点矫枉过正,当你有 python 读取文件时......
  • @Jean-FrançoisFabre:有点矫枉过正?
  • 但也许 OP 已经简化了这个问题。嗯,总有希望。

标签: python shell subprocess cat


【解决方案1】:

这就是评估* 的shell 的作用。如果你不使用它,你需要自己做,glob可以帮助你。

因此您可以通过以下方式修复您的示例:

from glob import glob
try:
    result = subprocess.run(
        ["cat"] + glob("/etc/*-release"),
        stdout=subprocess.PIPE,
        stderr=subprocess.PIPE,
        universal_newlines=True)
except subprocess.TimeoutExpired as err:
    result = err

【讨论】:

  • 我们确定将输出和错误都重定向到PIPE 不会死锁吗?
  • 顺便说一句,这里不可能有超时。
  • 第一个参数可以是'cat',而不是'/bin/cat'——必要时会进行路径查找。
  • 我没有遇到死锁问题,但是,这个解决方案抛出了同样的错误。
  • @PayamMesgari,如果您在 REPL 上单独运行 glob('/etc/*-release') 会返回什么(在此答案中的 import 行之后)?如果那个 glob 表达式返回原始字符串,它只会是 same 错误。
【解决方案2】:

您可以使用 bash 命令来评估 *:

process =  subprocess.run(['bash', '-i', '-c',  'cat /etc/*-release'], stdout=subprocess.PIPE, stderr=subprocess.PIPE)

【讨论】:

  • 这完全违背了练习的目的。 shell=True 将在您的参数列表前加上 ['sh', '-c'];如果 OP 可以使用 shell(他们不应该这样),他们可以使用它。
猜你喜欢
  • 2018-08-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-02-21
  • 2013-11-22
  • 1970-01-01
相关资源
最近更新 更多