我试图在子进程中运行一个长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
答案 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 ++)中,您将看到它被识别并显示为单个字符串。