返回
在 Windows 上使用命名管道管理后台 Python 进程和输出重定向
windows
2024-03-12 20:20:17
在 Windows 上利用命名管道实现后台进程和输出重定向
在需要让 Python 进程在后台运行并将其输出重定向到文件或其他位置时,可以通过利用 Windows API 创建管道和进程来实现。
创建命名管道
创建一个命名管道,用作 Python 进程和父进程之间的通信机制。这允许在不同的进程之间交换数据。
启动 Python 进程
使用 CreateProcess()
函数启动一个 Python 进程,并将其输出重定向到创建的命名管道。这将使 Python 进程在后台运行,其输出将被捕获。
等待进程完成并关闭管道
等到 Python 进程完成并关闭命名管道。这确保管道中的所有数据都已读取。
读取管道输出
读取命名管道中的输出,将其写入文件或执行所需的处理。
代码示例
以下代码示例演示了如何在 Windows 上使用命名管道启动一个后台 Python 进程并重定向其输出:
import win32pipe, win32file, win32event, win32process, msvcrt
def create_pipe():
pipe_name = r'\\.\pipe\MyPipe'
pipe = win32pipe.CreateNamedPipe(
pipe_name,
win32pipe.PIPE_ACCESS_DUPLEX,
win32pipe.PIPE_TYPE_BYTE | win32pipe.PIPE_WAIT,
1, # 最大实例数
65536, # 输出缓冲区大小
65536, # 输入缓冲区大小
0, # 默认超时时间
None)
return pipe
def start_process(pipe):
startup_info = win32process.STARTUPINFO()
startup_info.dwFlags |= win32process.STARTF_USESTDHANDLES
startup_info.hStdOutput = pipe
startup_info.hStdError = pipe
process_info = win32process.CreateProcess(
None, # 可执行文件(默认使用 Python 解释器)
'python my_script.py', # 脚本路径
None, # 进程安全属性
None, # 线程安全属性
1, # 继承句柄
win32process.CREATE_NEW_CONSOLE, # 创建新的控制台
None, # 环境变量
None, # 当前目录
startup_info)
return process_info
def wait_and_close(process_info, pipe):
win32event.WaitForSingleObject(process_info.hProcess, win32event.INFINITE)
win32file.CloseHandle(pipe)
def read_output(pipe):
output = []
while True:
data = win32file.ReadFile(pipe, 65536)
if not data:
break
output.append(data.decode('utf-8'))
return ''.join(output)
if __name__ == '__main__':
pipe = create_pipe()
process_info = start_process(pipe)
wait_and_close(process_info, pipe)
output = read_output(pipe)
print(output)
常见问题解答
Q1:如何确定 Python 进程是否已完成?
A1:可以使用 WaitForSingleObject()
函数来等待 Python 进程完成。
Q2:管道中的数据是否会丢失?
A2:在 Python 进程完成并关闭管道之前,管道中的数据不会丢失。
Q3:可以在不同的计算机上使用此方法吗?
A3:此方法需要命名管道,这只能在同一台计算机上使用。
Q4:可以重定向多个 Python 进程的输出到同一个管道吗?
A4:可以,但是需要为每个进程创建单独的命名管道。
Q5:为什么使用命名管道而不是其他方法,如套接字?
A5:命名管道是一种高效的进程间通信方式,特别适用于本地通信。