【问题标题】:Python Subprocess with double quotes带双引号的 Python 子进程
【发布时间】:2022-08-03 11:02:50
【问题描述】:

我有一个接受 NiFi 操作的 Docker 服务日志,我只想捕获包含“成功发送”的日志条目\"无法处理会话\"(仅此而已)。它们应该被捕获在当前工作目录中名为 \"nifi_logs\" 的目录中。我需要使用 Python 来完成所有这些工作。

这是我到目前为止得到的:

docker_log = \'docker service logs nifi | grep -e \"Successfully sent\" -e \"Failed to process session\" >> $PWD/nifi_logs/nifi1.log\'
subprocess.Popen(docker_log, shell=True, stdout=subprocess.PIPE, stderr=subprocess.STDOUT)

我相信subprocess.Popen()grep 中使用的双引号有困难,因为nifi1.log 完全是空的。如果第一个命令如下所示:

docker_log = \'docker service logs nifi | grep session >> $PWD/nifi_logs/nifi1.log\'

Python 代码工作得很好,并在nifi1.log 中使用 \"session\" 捕获所有日志条目。正如我上面解释的那样,我需要 grep 来获取 2 种日志条目,并且都包含多个单词,这意味着我需要使用引号。

如果我只是在没有 Python 的终端上运行这个命令:

docker service logs nifi | grep -e \"Successfully sent\" -e \"Failed to process session\" >> $PWD/nifi_logs/nifi1.log

日志生成的条目很好,所以我知道 Docker 服务命令编写正确。

我尝试过切换单引号和双引号,我尝试在单引号中使用\\\" 而不是\" ...nifi1.log 仍然为空。

我也尝试使用os.system() 而不是subprocess.Popen(),但我遇到了同样的问题(我相信os.system() 有点过时了)。

我需要做些什么来更改docker_log 等于什么,以便它可以正确地grep 2个搜索条件?所以你知道:这个问题不是问我如何生成日志条目(我知道我在寻找什么 Docker 服务,它们会正确生成),只是我需要做什么才能让 Python Subprocess Popen 接受带引号的命令。

  • 你好@PillagingProgrammer,欢迎来到 StackOverflow!我在Repl.it 上进行了测试,它奏效了。您使用的是哪个 Python 版本?另外,您可以发布docker service logs nifi 的结果示例吗?

标签: python docker subprocess popen


【解决方案1】:

感谢您的帮助@David。看看你的例子,我找到了一个解决方案:我从subprocess.Popen 中删除了stdout=subprocess.PIPE,现在它接受双引号就好了!

docker_log = 'docker service logs nifi | grep -e "Successfully sent" -e "Failed to process session" >> $PWD/nifi_logs/nifi1.log'
subprocess.Popen(docker_log, shell=True, stderr=subprocess.STDOUT)

【讨论】:

    猜你喜欢
    • 2016-07-08
    • 2019-08-11
    • 1970-01-01
    • 2013-06-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多