我抄写了一些代码来概述我想要做的事情。我似乎无法使语法正确,有人可以帮忙吗?
def calc_execution():
import subprocess
#get the proc id of detectmotion; need help converting into subprocess
detectmotion_file_pid = subprocess.call(pgrep -f "detectmotion.py")
if detectmotion_file_pid:
#determine how long pid has been running; note this seems to be incorrect
len_run_time=subprocess.call(ps -o etime= -p detectmotion_file_pid)
print len_run_time
我的问题是让var detectmotion_file_pid
和len_run_time
的语法正常工作。
有人可以帮忙吗?
由于
答案 0 :(得分:0)
subprocess.call()
期望字符串或字符串数组作为args
参数 - 请参阅文档here。
您正在提供:
subprocess.call(pgrep -f "detectmotion.py")
,由python解释为:
pgrep
的值,然后减去f
你的意思是:
subprocess.call([ 'pgrep', '-f', 'detectmotion.py'])
该数组中的每个项目都用作下一个进程的参数。 pgrep
标识您要运行的二进制文件(并在新进程中显示为arg 0)。 <{1}}和-f
是下一个论点。
对于下一个(获取运行时),你再次做同样的事情 - 对以下内容的简单修复。
detectmotion.py
最后一个问题是,您期望subprocess.call(['ps', '-o', 'etime=', '-p', detectmotion_file_pid ])
的返回值是您所追求的数据。事实上,subprocess.call()
将:
等待命令完成,然后返回returncode属性。
如果你想捕获刚刚运行的命令的输出,那么你需要使用“ pipe ”,将命令的输出带到你的应用程序中,这是事情变得混乱,文档说:
注意:不要将stdout = PIPE或stderr = PIPE与此函数一起使用,因为它可能会基于子进程输出量死锁。当您需要管道时,可以使用
subprocess.call()
Popen
方法。
因此...
communicate()
您需要对x = subprocess.Popen([ 'pgrep', '-f', 'detectmotion.py'])
out, _ = x.communicate()
# out is currently a string, e.g: '26585\n'
print(out)
# convert it into an integer:
detectmotion_file_pid = int(out.rstrip())
的输出执行类似的操作,因为这会以人类可读的格式返回您的时间。
ps -o etime= -p ...
此时,您可能会问自己如何将看似x = subprocess.Popen(['ps', '-o', 'etime=', '-p', str(detectmotion_file_pid) ])
out, _ = x.communicate()
# out is currently a string, e.g: ' 12:53\n'
print(out)
# strip it
out = out.strip()
# now it's free of white-space, e.g: '12:53'
print(out)
格式转换为更有用的内容......不幸的是mm:ss
的输出是为人类设计的,可能并不是非常直截了当像这样解析。
您可能更愿意查看/proc/[pid]/stat
,它可以告诉您有关流程的各种信息: