我有一个如下所示的命令:
ps v -p 2585 | awk '{if ($9 != "%MEM") {print $9}}'
Run Code Online (Sandbox Code Playgroud)
现在这在 bash 中运行得很好,它只需要你给它的 pid 的内存部分。不过我现在正在尝试用 python 实现它,但遇到了一些问题。这是我在 python 中的内容
cmd1 = ['ps', 'v', '-p', pid]
cmd2 = ['awk', '\'{if ($9 != "%MEM") {print $9}}\'']
Run Code Online (Sandbox Code Playgroud)
现在运行它们...
runcmd1 = subprocess.Popen(cmd1, stdout=subprocess.PIPE)
runcmd2 = subprocess.Popen(cmd2, stdin=runcmd1.stdout, stdout=subprocess.PIPE)
Run Code Online (Sandbox Code Playgroud)
我收到此错误:
awk: '{if (\$9 != "%MEM") {print \$9}}'
awk: ^ invalid char ''' in expression
Run Code Online (Sandbox Code Playgroud)
我用它来打印命令的样子... sys.stdout.write(' '.join(cmd1)+' '+'|'+' '+' '.join(cmd2)+'\n ')
它给出了:
ps v -p 1073 | awk '{if ($9 != "%MEM") {print $9}}'
Run Code Online (Sandbox Code Playgroud)
我认为这和实际运行的 bash 命令没有区别。有人可以帮忙吗?
当您通过 popen 运行 awk 命令时,您不需要保护 awk 命令免受 shell 的影响(参数已经分成一个列表,因此您的空格不会受到影响)。
cmd2 = ['awk', '{if ($9 != "%MEM") {print $9}}']
Run Code Online (Sandbox Code Playgroud)
会工作得很好。
Python 有一些编写字符串的好方法,可以在您确实需要它的情况下避免像您在此处尝试做的那样转义:
cmd2 = ['awk', '{if ($9 != "%MEM") {print $9}}']
Run Code Online (Sandbox Code Playgroud)