Python子进程无效语法

时间:2016-01-01 14:27:53

标签: python bash subprocess

我试图在子进程中运行一个长bash命令,但它给了我语法错误。目标是在命令的末尾添加文件名。

ok="file.csv"

p = subprocess.Popen("awk -F'"?,"?' '{ split($2, a, / /); if (a[2] == "KB") a[1] /= 1000; sum += a[1] } END { print sum }' %s " %(ok),stdout=subprocess.PIPE, shell=True)
(sum,err) = p.communicate()

print sum

这是我在命令行中运行代码的方法(有效):

student@student-vm:~/Downloads$ awk -F'"?,"?' '{ split($2, a, / /); if (a[2] == "KB") a[1] /= 1000; sum += a[1] } END { print sum }' file.csv
1346.94

1 个答案:

答案 0 :(得分:2)

查看语法高亮显示。您是否看到发送给Popen()的字符串不是单个字符串?有一个字符串,然后是?,,然后是一个字符串,然后是KB,然后是一个字符串。尝试使用三引号字符串:

ok="file.csv"

p = subprocess.Popen("""awk -F'"?,"?' '{ split($2, a, / /); if (a[2] == "KB") a[1] /= 1000; sum += a[1] } END { print sum }' %s """ %(ok),stdout=subprocess.PIPE, shell=True)
(sum,err) = p.communicate()

print sum

请注意,此答案代码中的语法突出显示使其看起来仍然存在,但这是如何处理三重引用字符串的问题。将它放入IDE或编辑器(如Notepad ++)中,您将看到它被识别并显示为单个字符串。