【问题标题】:Get bool output from bash command in python [duplicate]从python中的bash命令获取布尔输出[重复]
【发布时间】:2021-11-10 17:41:18
【问题描述】:

我有一个如下所示的脚本部分:

if ( pstree -s $$ | grep -q 'sshd' ); then
    SOME_VAR=foo
else
    SOME_VAR=boo
fi

我需要在 python 中做同样的事情。有没有办法可以从 if() 中的命令获取布尔输出?也许使用退出代码或smth,所以代码看起来像这样:

if os.system("pstree -s $$ | grep -q 'sshd'"):
  os.environ['SOME_VAR']='foo'
else:
  os.environ['SOME_VAR']='boo'

我尝试像这样使用subprocess 库:

args = shlex.split("pstree -s $$ | grep -q 'sshd'")
p = subprocess.Popen(args, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
o, e = p.communicate()

print('Output: ' + o.decode('ascii'))
print('Error: ' + e.decode('ascii'))
print('code: ' + str(p.returncode))

但上面写着Error: pstree: invalid option -- 'q'

【问题讨论】:

  • 您是否尝试过您发布的代码? os.system 版本适合我。
  • @Woodford 在我的情况下它设置了 boo,但它应该设置为“foo”
  • grep -q 退出,0 表示成功(找到模式),256 表示失败(未找到模式)。通过 grep-ing 来检查您的结果,查找应该 找到的进程名称(例如 grep -q 'notsshd
  • 需要明确的是,shlex.split() 不会使管道工作。要使用不带shell=True 的管道,您需要为管道的每一侧提供一个单独的subprocess.Popen 对象。

标签: python bash


【解决方案1】:

您可以使用 psutil 这样做:

#!/usr/bin/env python3
# -*- coding: utf-8 -*-

import os
import psutil

def has_sshd():
    "Return True if process sshd exist."
    for p in psutil.process_iter(['name']):
        if p.info['name'] == 'sshd':
            return True
    return False

if has_sshd():
    os.environ['SOME_VAR']='foo'
else:
    os.environ['SOME_VAR']='boo'

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-01-22
    • 2016-04-30
    • 2014-08-31
    • 1970-01-01
    • 1970-01-01
    • 2015-06-19
    • 2019-03-13
    • 2013-09-06
    相关资源
    最近更新 更多