如何用subprocess执行awk脚本?Windows下遇文件找不到错误
问题描述
我在同一目录下有三个文件:ex.awk、data.csv、file.py。希望通过subprocess执行awk脚本,用于后续PyTest测试用例调用。
示例文件
ex.awk
#!/usr/bin/awk -f BEGIN { FS = ","; } { print NF; } END {print "DONE"}
data.csv
10,34,32 4,76,8304 4759,5869,2940
file.py
import subprocess cmd = ['awk', '-f', 'ex.awk', 'data.csv'] subprocess.run(cmd)
在bash中执行命令awk -f ex.awk data.csv可得到正确结果:
3 3 3 DONE
但运行file.py时出现错误:FileNotFoundError: [WinError 2] The system cannot find the file specified。请问参数数组是否缺失内容?是否需要使用shell等其他subprocess参数?
解决方案
这个错误的核心原因是Windows系统默认不自带awk命令——除非你预先安装了Git Bash、Cygwin、GNU Awk等工具,并将其可执行文件路径添加到系统环境变量PATH中。针对这个问题,有几种可行的解决方式:
方式1:指定awk可执行文件的完整路径
如果你已经安装了awk工具(比如GNU Awk),找到它的.exe文件路径,直接替换命令数组中的awk为完整路径。例如:
import subprocess cmd = ['C:/Program Files/GnuWin32/bin/gawk.exe', '-f', 'ex.awk', 'data.csv'] subprocess.run(cmd)
方式2:启用shell参数
设置shell=True让subprocess调用系统shell来解析执行命令,这样shell会自动从环境变量PATH中查找awk的位置(前提是awk路径已加入PATH,或者你使用的是自带awk的终端环境如Git Bash)。可以用字符串形式的命令:
import subprocess cmd = 'awk -f ex.awk data.csv' subprocess.run(cmd, shell=True)
也可以保留数组形式的命令,配合shell=True使用:
import subprocess cmd = ['awk', '-f', 'ex.awk', 'data.csv'] subprocess.run(cmd, shell=True)
方式3:指定bash作为执行环境(针对Git Bash用户)
如果你用Git Bash作为开发环境,可以直接指定subprocess使用bash.exe来执行命令,确保在bash环境下运行awk:
import subprocess cmd = ['awk', '-f', 'ex.awk', 'data.csv'] subprocess.run(cmd, executable='C:/Program Files/Git/bin/bash.exe')
内容的提问来源于stack exchange,提问作者fuusei
相关产品推荐
相关产品推荐

