【问题标题】:Shell substitution in subprocess子进程中的外壳替换
【发布时间】:2019-01-11 19:33:08
【问题描述】:

有人能指出使用 subprocess 模块进行 shell 替换的正确方法吗?作为一个简单的例子,考虑以下情况

result = subprocess.check_output(['ls', '-l', '/tmp/`date +"%Y-%m-%d"`'], shell=True)

以下变体已尝试但未成功

result = subprocess.check_output(['ls', '-l', '/tmp/$(date +"%Y-%m-%d")'], shell=True)
    result = subprocess.check_output(['ls', '-l', '/tmp/date +"%Y-%m-%d"'], shell=True)

另外,subprocess.Popen 会比 check_output 更好吗?

【问题讨论】:

  • 我更感兴趣的是了解 shell 替换如何与子进程模块一起工作。是的,我知道这些,我只是想弄清楚当出现需要替换 shell 的情况时,最好的方法是什么,我会编辑这个问题,谢谢

标签: python shell subprocess


【解决方案1】:

Shell 替换只发生在 shell 中,而您没有运行它。没有办法引用它来使它起作用。

相反,自己做 shell 的工作:

import subprocess
date = subprocess.check_output(['date', '+%Y-%m-%d']).rstrip("\n")
result = subprocess.check_output(['ls', '-l', '/tmp/' + date])
print(result)

或者,您可以在 shell 中运行该命令。这需要更少的思考,但更脆弱:

result = subprocess.check_output('ls -l /tmp/$(date +"%Y-%m-%d")', shell=True)

【讨论】:

  • 在 python2 中 result = subprocess.check_output('ls -l /tmp/$(date +"%Y-%m-%d")', shell=True) 导致错误。是的,我知道我可以将该部分卸载到 python 函数中,但我很想知道如何使用子进程模块运行它,我确实尝试过使用 shell=True 的变体,但它不起作用另外,它应该可能是 date = subprocess.check_output(['date', '+%Y-%m-%d']).decode("utf-8").rstrip("\n")
  • 它在我的系统上的 python2 中工作。你遇到了什么错误?
  • 我的错,它确实返回正确的结果,将其标​​记为 asnwer
猜你喜欢
  • 1970-01-01
  • 2013-01-07
  • 1970-01-01
  • 2010-11-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多