将 Python 标准 IO 公开给子进程
Expose Python standard IO to Subprocess
在Python 3.5.1上,我有以下内容:
output = subprocess.check_output(cmd).decode(encoding="UTF-8")
这会将正确调用的命令cmd
。 cmd
中的 C++14 代码如下所示:
HANDLE handle = GetStdHandle(STD_OUTPUT_HANDLE);
assert(handle!=INVALID_HANDLE_VALUE); //Always passes
assert(handle!=nullptr); //Always passes
CONSOLE_SCREEN_BUFFER_INFO csbi;
BOOL result = GetConsoleScreenBufferInfo(handle,&csbi);
assert(result!=0); //Always fails. `GetLastError()` returns 6 (invalid handle)
运行上述 Python 代码会导致子进程cmd
在指示的行处失败。 根据 Python 文档,在这种情况下,stdout/stderr 应该继承自父进程(即 Python 解释器)。 所以,它不应该。 事实上,上述工作得很好,例如 printf
编辑输出。
尝试显式重定向也会失败:
#Traceback (most recent call last):
# File "C:devPython35libsubprocess.py", line 914, in __init__
# errread, errwrite) = self._get_handles(stdin, stdout, stderr)
# File "C:devPython35libsubprocess.py", line 1145, in _get_handles
# c2pwrite = msvcrt.get_osfhandle(stdout.fileno())
#io.UnsupportedOperation: fileno
p = subprocess.Popen(cmd.split(" "),stdout=sys.stdout,stderr=sys.stderr)
#Using `subprocess.PIPE` instead fails in the same way as the `subprocess.check_output(...)`
#example originally given above.
出了什么问题? 我该如何解决?
管道不是控制台。 check_output()
内部使用stdout=PIPE
。它不会重定向控制台输出(由 WriteConsoleW()
生成)。
第一个错误(无效句柄)表明标准输出不是控制台设备。
除非是所需的行为(在标准输出之外打印);如果 stdout 不是控制台设备,请使用WriteFile()
。
第二个错误(io.UnsupportedOperation: fileno
)表明sys.stdout
不是真正的文件,因此您不能将其作为参数传递给子进程stdout
(您可以使用stdout=PIPE
重定向子进程的stdout并使用print()
或sys.stdout.write()
方法直接打印输出)。
相关文章:
- 终止 QProcess 不会终止子进程
- 什么时候最好在子进程中使用 CPU 或 I/O 密集型代码 [ C++ ]
- 子进程更新共享 mmap 内存,但父进程没有更改
- 使用 waitpid 时等待子进程终止
- 使用重定向标准处理子进程中的 kbhit
- 由 JOB 中的进程启动的子进程是否可以将 JOB 属性设置为脱离作业?
- 是否可以将子进程的 stdout 重定向到父进程中的另一个文件?
- kill() 总是返回 0(成功),即使在子进程已经结束之后?
- 父进程和子进程之间的 POSIX 信号量
- 检测到由于操作系统内存不足而导致子进程终止
- 使用system()创建独立的子进程
- 从stdin读取时子进程挂起(fork/dup2竞争条件)
- 在 Bash 脚本中处理来自子进程的信号
- Qt C++ - 如何成功将数据传递给子进程?
- C++ 窗口本地系统模拟在子进程中失败
- 将类型化数组写入子进程 stdin 无法正常工作
- 将 nodejs 脚本作为子进程执行(而不是从其他脚本执行)
- 使用信号检测子进程何时终止的最佳方法是什么?
- 将 Python 标准 IO 公开给子进程
- 子进程的异步双向IO重定向