在Python中,我们可以通过`subprocess`模块来创建子进程。要合并子进程的stdout和stderr,同时保持它们可区分,我们可以使用`Popen`对象中的`communicate()`方法。这个方法会返回一个元组,第一个元素是标准输出,第二个元素是标准错误输出。
以下是一个简单的示例:
```python
import subprocess
# 创建一个子进程
p = subprocess.Popen(['ls', '-l'], stdout=subprocess.PIPE, stderr=subprocess.PIPE)
# 获取子进程的输出
stdout, stderr = p.communicate()
# 打印标准输出和错误输出
print("stdout:")
print(stdout.decode('utf-8'))
print("stderr:")
print(stderr.decode('utf-8'))
```
在这个示例中,我们首先创建了一个子进程,该子进程是运行`ls -l`命令的。然后,我们使用`communicate()`方法获取子进程的输出。这个方法会阻塞,直到子进程结束。最后,我们打印出标准输出和错误输出。
如果你需要同时捕获标准输出和错误输出,你可以直接将它们合并:
```python
import subprocess
# 创建一个子进程
p = subprocess.Popen(['ls', '-l'], stdout=subprocess.PIPE, stderr=subprocess.STDOUT)
# 获取子进程的输出
stdout, _ = p.communicate()
# 打印输出
print("Output:")
print(stdout.decode('utf-8'))
```
在这个示例中,我们将错误输出直接重定向到标准输出。然后,我们只处理标准输出。
如果你需要保持标准输出和错误输出的可区分,你可以给它们不同的名称:
```python
import subprocess
# 创建一个子进程
p = subprocess.Popen(['ls', '-l'], stdout=subprocess.PIPE, stderr=subprocess.STDOUT)
# 获取子进程的输出
stdout, _ = p.communicate()
# 将标准输出和错误输出分开
output = stdout.decode('utf-8')
error = ""
# 如果有错误输出,将其添加到error变量中
if output.endswith(":\n"):
error = output[len(output) - 1:]
output = output[:len(output) - 2]
# 打印输出和错误输出
print("Output:")
print(output)
print("Error:")
print(error)
```
在这个示例中,我们检查标准输出是否以":\n"结尾。如果是,那么它就是错误输出,我们将错误输出添加到`error`变量中。然后,我们将标准输出和错误输出分开,并打印它们。
请注意,这些示例假设你的子进程不会生成大量的输出,否则可能会消耗大量的内存。对于大量输出的子进程,你可能需要使用非阻塞I/O或者异步I/O来读取输出。