为什么在使用子进程时出现FileNotFoundError?

时间:2020-08-09 09:17:23

标签: python subprocess file-not-found

我的代码:

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

错误:

File "c:/Users/Leon/Documents/VS Code/film.py", line 92, in <module>
    for line in subprocess.Popen(['bzcat'],
  File "C:\Program Files\WindowsApps\PythonSoftwareFoundation.Python.3.8_3.8.1520.0_x64__qbz5n2kfra8p0\lib\subprocess.py", line 854, in __init__
    self._execute_child(args, executable, preexec_fn, close_fds,
  File "C:\Program Files\WindowsApps\PythonSoftwareFoundation.Python.3.8_3.8.1520.0_x64__qbz5n2kfra8p0\lib\subprocess.py", line 1307, in _execute_child
    hp, ht, pid, tid = _winapi.CreateProcess(executable, args,
FileNotFoundError: [WinError 2] Das System kann die angegebene Datei nicht finden

我确实导入了子流程。

文件 C:\ Program Files \ WindowsApps \ PythonSoftwareFoundation.Python.3.8_3.8.1520.0_x64__qbz5n2kfra8p0 \ lib \ subprocess.py 存在。

1 个答案:

答案 0 :(得分:3)

显然bzcat不在您的PATH中。它不是在抱怨找不到subprocess.py,而是在抱怨找不到想要运行的命令。

无论如何,您不需要子进程即可读取.bz2个文件;请参阅Python标准库中的bz2 module

import bz2

with bz2.open(path, 'rt') as handle:
    for line in handle:
        parser.feed(line)

与所有压缩格式一样,bzip2是二进制格式,因此您应该使用open(path, 'rb')bz2.open()函数(有点奇怪)默认为二进制模式。如果要读取和解码为文本,则必须明确指定'rt'