【问题标题】:Why do I get a FileNotFoundError when using subprocess?为什么在使用子进程时会收到 FileNotFoundError?
【发布时间】:2020-08-09 09:17:23
【问题描述】:

我的代码:

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 存在。

【问题讨论】:

    标签: python subprocess file-not-found


    【解决方案1】:

    显然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'

    【讨论】:

    • 我只是尝试在 Windows 上重新创建它,你是对的,似乎确实如此。您认为这可能是 Windows 独有的错误吗?
    • 什么错误?如果他们没有安装bzcat,这仅在 Windows 上很常见,但您会在例如如果您忘记安装 bzcat,或者如果您弄乱了您的 PATH 以至于无法找到它,Alpine Linux。
    • Windows 独有的错误是您可以传入带有空格的字符串,甚至可以传入带有shell=False 空格的字符串的列表;但 Windows 人似乎认为这是一项功能,而不是错误。
    猜你喜欢
    • 2013-07-13
    • 1970-01-01
    • 2021-11-02
    • 1970-01-01
    • 2021-09-16
    • 2019-07-29
    • 2017-12-21
    • 2022-09-27
    • 1970-01-01
    相关资源
    最近更新 更多