You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

使用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

火山引擎 最新活动