【问题标题】:Python subprocess does not work with complex linux commandsPython 子进程不适用于复杂的 linux 命令
【发布时间】:2015-03-04 12:01:28
【问题描述】:

我在 Linux 中有一个命令,它会给出以下输出:

1425463080: 0.0000000000e+00 0.0000000000e+00
1425463085: 0.0000000000e+00 0.0000000000e+00
1425463090: 0.0000000000e+00 0.0000000000e+00
1425463095: 0.0000000000e+00 0.0000000000e+00
...

为了使其更易于阅读,我使用 awk 命令如下:

my command | awk 'NR > 2 {printf "%s %0.2f %0.2f\n", $1, $2, $3;}'

现在要删除多余的,我使用sed如下:

my command | awk 'NR > 2 {printf "%s %0.2f %0.2f\n", $1, $2, $3;}' | sed 's/://g'

有了这个,我得到了预期的输出:

1425463715 0.16 0.42
1425463720 0.16 0.42
1425463725 0.16 0.42
...

现在我想通过 Python 运行上面的命令。但是我在通过 Python 子进程模块运行它时遇到了很多问题。例如我面临以下错误:

('', 'awk: NR > 2 {printf "%s %0.2f %0.2f\nawk: ^ 未终止的字符串\n')

即使我将命令指定为:

cmd = """ my command | awk 'NR > 2 {printf "%s %0.2f %0.2f\n", $1, $2, $3;} """
subprocess.Popen(cmd, ...)

...还是不行。

如果我的 Linux 命令正确,请告诉我。如果是,那么我如何通过 Python 子进程执行它。

【问题讨论】:

  • 你设置shell=True了吗?没有它,您将尝试运行名为 my command' | awk 'NR > 2 {...etc.. 的单个可执行文件
  • 是的,shell=True 也试过了
  • 你错过了my command周围的开场白
  • 您的样本 cmd 在第一个 | 之前包含一个杂散的 ' 单引号。此外,\n 不会被转义。
  • 你错过了 awk sn-p 上的尾随引号

标签: python linux awk sed


【解决方案1】:

您需要对\n 转义序列进行转义; Python 也解释了这一点;您还缺少 awk 命令中的结束 ' 单引号:

cmd = """ 'my command' | awk 'NR > 2 {printf "%s %0.2f %0.2f\\n", $1, $2, $3;}' """

或使用原始字符串:

cmd = r""" 'my command' | awk 'NR > 2 {printf "%s %0.2f %0.2f\n", $1, $2, $3;}' """

请注意,Python 也完全有能力完成这项工作,无需在两者之间使用额外的 shell 二进制文件来解释 shell 语法。

【讨论】:

    猜你喜欢
    • 2018-03-09
    • 2016-04-26
    • 2016-12-27
    • 2012-05-22
    • 1970-01-01
    • 1970-01-01
    • 2021-12-10
    • 1970-01-01
    • 2017-08-24
    相关资源
    最近更新 更多