使用subprocess模块时触发FileNotFoundError的原因是什么?
解决subprocess调用bzcat时的FileNotFoundError问题
你在Windows环境下用Python调用bzcat工具时遇到的这个报错,核心原因其实很直观:bzcat是Linux、macOS这类类Unix系统自带的bzip2解压工具,Windows系统默认没有这个命令,所以subprocess找不到对应的可执行文件,才抛出了FileNotFoundError。
先贴一下你的原代码方便对照:
parser = xml.sax.make_parser() handler = WikiXmlHandler() parser.setContentHandler(handler) for line in subprocess.Popen(['bzcat'], stdin=open(path), stdout=subprocess.PIPE).stdout: try: parser.feed(line) except StopIteration: break
这里给你两个可行的解决思路:
思路1:给Windows安装bzcat工具
你可以通过以下方式获取Windows版的bzcat:
- 安装Git Bash,它自带了包括
bzcat在内的全套类Unix工具集 - 安装Cygwin或MinGW,这类工具链也能提供
bzcat - 直接下载bzip2的Windows预编译版本,找到其中的
bzcat.exe
安装后记得把bzcat.exe所在的文件夹路径添加到系统的PATH环境变量里,这样Python的subprocess就能找到这个命令了。
思路2:用Python内置的bz2模块替代外部调用(更推荐)
其实Python标准库已经自带了处理bzip2压缩文件的bz2模块,完全不需要依赖外部的bzcat工具,跨平台性更强,代码也更简洁。修改后的代码如下:
import bz2 import xml.sax parser = xml.sax.make_parser() handler = WikiXmlHandler() parser.setContentHandler(handler) # 用bz2模块直接读取压缩文件 with bz2.open(path, 'rb') as f: for line in f: try: parser.feed(line) except StopIteration: break
这个方案不需要额外安装任何工具,而且在Windows、Linux、macOS上都能正常运行,彻底避免了跨平台的兼容性问题。
内容的提问来源于stack exchange,提问作者Leon




