python - python 使用超时等待外部程序完成
问题描述
在我运行我的 python 脚本之前,我需要检查外部程序是否正在运行并等待它完成。
我有几部分,但在将它们组合成一个有凝聚力的脚本时遇到了一些困难。
我可以使用以下内容来获取程序的 PID 和一个将在 10 秒内超时的 while 循环
from subprocess import check_output
import time
def get_pid(name):
return check_output(["pidof",name])
print "%s" % get_pid("java")
timeout = time.time() + 10
test = 0
while True:
if time.time() > timeout:
print "exception goes here"
break
test = test + 1
time.sleep(1)
如果程序没有运行 get_pid 会失败,我认为我需要在这种情况下捕获异常?这是我不确定要去哪里的地方。也许有更好的方法来解决这个问题?
===============
这是一个似乎可以正常工作的更新。
from subprocess import check_output, CalledProcessError
import time
def get_pid(name):
try:
process_status = check_output(["pidof",name])
except CalledProcessError as e:
process_status = None
return process_status
timeout = time.time() + 10
program = "java"
while get_pid(program) != None:
time.sleep(1)
print "1 second loop"
if time.time() > timeout:
raise ValueError ('Timeout exceeded')
print "%s is not running" % program
解决方案
您可以尝试捕获此异常。因为当check_output
返回非零异常实例时,CalledProcessError
会引发可以处理的。像这样。
from subprocess import CalledProcessError
def get_pid(name):
try:
process_status = check_output(["pidof",name])
except CalledProcessError as e:
process_status = None # You can additionally get return code in the returncode attribute and any output in the output attribute.
return process_status
希望它有效!
推荐阅读
- c++ - 具有虚拟基类的可变类方法
- asp.net-mvc - ajax-post请求后如何防止SignalR客户端重新连接?
- ios - 使用 Apple 登录 - 手动表单
- sql-server - 当 SQL Server 和客户端软件在同一台计算机上时,SQL Server Always Encrypted 功能如何工作?
- sql - 在 Amazon REdshift 中查看权限 - 重新创建基础表并阻止查看权限
- jquery - 使用 getScript 加载外部脚本显示未定义
- docker - “docker ps”命令不报告从 traefik 反向代理服务使用的端口
- javascript - React 从其他组件调用函数
- angular - 如何以角度为子模块编写路由?
- hibernate - 使用插件 dsl 语法应用 hibernate-gradle-plugin?