如何在 Python 中启动、监视和终止进程
How to launch, monitor and kill a process in Python
我需要能够在 Python 中启动一个长 运行 进程。虽然进程是 运行,但我需要将输出通过管道传输到我的 Python 应用程序以在 UI 中显示它。 UI 还需要能够终止进程。
我做了很多研究。但我还没有找到一种方法来完成所有这三件事。
subprocess.popen() 让我启动一个进程并在需要时终止它。但是在该过程完成之前,它不允许我查看其输出。我正在监视的过程永远不会自行完成。
os.popen() 让我启动一个进程并监控其输出 运行。但我不知道有什么方法可以杀死它。我通常在调用 readline() 的过程中。
当使用os.popen()时,有没有办法在调用read()或readline之前知道缓冲区中是否有数据?例如...
output = os.popen(command)
while True:
# Is there a way to check to see if there is any data available
# before I make this blocking call? Or is there a way to do a
# non-blocking read?
line = output.readline()
print(line)
提前致谢。
我建议 subprocess.Popen 对流程进行细粒度控制。
import subprocess
def main():
try:
cmd = ['ping', '8.8.8.8']
process = subprocess.Popen(
cmd,
stdout=subprocess.PIPE,
stderr=subprocess.PIPE,
universal_newlines=True,
bufsize=1,
text=True
)
while True:
print(process.stdout.readline().strip())
except KeyboardInterrupt:
print('stopping process...')
process.kill()
if __name__ == '__main__':
main()
- 将
stdout
和 stderr
kwargs 设置为 subprocess.PIPE
允许您通过 .communicate
读取各自的流,而不是将它们打印到父流(因此它们会出现在您 运行 脚本中的终端中)
.kill()
允许您随时终止进程
process.stdout
和 process.stderr
可以随时通过 readline()
查询以获得它们的当前行,或者通过 read()
或 readlines()
我需要能够在 Python 中启动一个长 运行 进程。虽然进程是 运行,但我需要将输出通过管道传输到我的 Python 应用程序以在 UI 中显示它。 UI 还需要能够终止进程。
我做了很多研究。但我还没有找到一种方法来完成所有这三件事。
subprocess.popen() 让我启动一个进程并在需要时终止它。但是在该过程完成之前,它不允许我查看其输出。我正在监视的过程永远不会自行完成。
os.popen() 让我启动一个进程并监控其输出 运行。但我不知道有什么方法可以杀死它。我通常在调用 readline() 的过程中。
当使用os.popen()时,有没有办法在调用read()或readline之前知道缓冲区中是否有数据?例如...
output = os.popen(command)
while True:
# Is there a way to check to see if there is any data available
# before I make this blocking call? Or is there a way to do a
# non-blocking read?
line = output.readline()
print(line)
提前致谢。
我建议 subprocess.Popen 对流程进行细粒度控制。
import subprocess
def main():
try:
cmd = ['ping', '8.8.8.8']
process = subprocess.Popen(
cmd,
stdout=subprocess.PIPE,
stderr=subprocess.PIPE,
universal_newlines=True,
bufsize=1,
text=True
)
while True:
print(process.stdout.readline().strip())
except KeyboardInterrupt:
print('stopping process...')
process.kill()
if __name__ == '__main__':
main()
- 将
stdout
和stderr
kwargs 设置为subprocess.PIPE
允许您通过.communicate
读取各自的流,而不是将它们打印到父流(因此它们会出现在您 运行 脚本中的终端中) .kill()
允许您随时终止进程process.stdout
和process.stderr
可以随时通过readline()
查询以获得它们的当前行,或者通过read()
或readlines()