gpt4 book ai didi

python - 操作系统错误 : [Errno 22] Invalid argument in subprocess

转载 作者:太空狗 更新时间:2023-10-29 17:46:42 25 4
gpt4 key购买 nike

python 3.3.3Windows 7

Here is the full stack:
Traceback (most recent call last):
File "Blah\MyScript.py", line 578, in Call
output = process.communicate( input=SPACE_KEY, timeout=600 )
File "C:\Python33\lib\subprocess.py", line 928, in communicate
stdout, stderr = self._communicate(input, endtime, timeout)
File "C:\Python33\lib\subprocess.py", line 1202, in _communicate
self.stdin.write(input)
OSError: [Errno 22] Invalid argument

代码如下所示:

process = subprocess.Popen( arguments,
stdin=subprocess.PIPE,
stdout=subprocess.PIPE,
stderr=subprocess.PIPE,
universal_newlines=True,
env=environment )

output = process.communicate( input=SPACE_KEY, timeout=600 )

这段代码每天运行数百次都没有问题。但是,如果在同一台机器上运行多个脚本(相同的脚本,但有时来自不同的文件夹),我会收到错误消息。这些脚本没有执行相同的事情(即:当我收到此错误时,另一个脚本没有执行子进程)。

subProcess 代码会引发错误,并向其提供许多不同的命令行。

那么,有人知道发生了什么事吗?解释器是否存在多次执行(在不同进程中)的问题?如果解释器运行相同(或非常相似)的脚本,通常可以完美运行的相同代码就会出错。但他们通常执行脚本的不同部分。

我很茫然:在 8 核机器上使用单个处理器很烦人。

最佳答案

以前 communicate 只在写入进程 stdin 时忽略了 EPIPE 错误。从 3.3.5 开始,根据 issue 19612 ,如果 child 已经退出,它也会忽略 EINVAL (22)(参见 Lib/subprocess.py 行 1199)。

背景:

process.communiciate 调用 process.stdin.write,后者调用 io.FileIO.write,后者在 Windows 上调用 C 运行时 _write ,它调用 Win32 WriteFile(在本例中调用 NtWriteFile,它作为 IRP_MJ_WRITEFastIoWrite 分派(dispatch)到 NamedPipe 文件系统)。

如果后者失败,它会在线程中设置 Windows system error code。在这种情况下,底层的 Windows 错误可能是 ERROR_NO_DATA (232),因为子进程已经退出。 C 运行时将其映射到 EINVAL (22) 的 errno 值。然后由于 _write 失败,FileIO.write 根据 errno 的当前值引发 OSError


附录:

如果 CRT 将 ERROR_NO_DATA 映射到 EPIPE,则根本不会有问题。 Python 自己的 Windows 错误转换通常遵循 CRT,但根据 issue 13063 ,它会异常(exception)地将 ERROR_NO_DATA 映射到 EPIPE (32)。因此,如果 child 已经退出,_winapi.WriteFile 引发 BrokenPipeError

如果子进程已经退出,以下示例将复制 EINVAL 错误。它还显示了 _winapi.WriteFile(3.3.3 源链接)如何将此错误映射到 EPIPE。 IMO,这应该被视为 Microsoft CRT 中的错误。

>>> cmd = 'reg query hkcu'                                                
>>> process = Popen(cmd, stdin=PIPE, stdout=PIPE, universal_newlines=True)
>>> process.stdin.write(' ')
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
OSError: [Errno 22] Invalid argument

>>> hstdin = msvcrt.get_osfhandle(process.stdin.fileno())
>>> _winapi.WriteFile(hstdin, b' ')
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
BrokenPipeError: [WinError 232] The pipe is being closed

关于python - 操作系统错误 : [Errno 22] Invalid argument in subprocess,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23688492/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com