将输出从subprocess.Popen传递给if elif语句

时间:2011-09-25 20:20:48

标签: python linux

我创建一个python脚本来检查suPHP我正在尝试创建一个if else语句来声明suPHP是否在服务器上使用subprocess.Popen的输出

我在创建这篇文章之前用print测试了变量的输出,并将正确的输出传递给变量suphp。这就是我到目前为止所做的:

# check for suPHP
suphp =  subprocess.Popen("/usr/local/cpanel/bin/rebuild_phpconf --current", shell=True, stdout=subprocess.PIPE,).communicate()[0]

 if suphp = "/bin/sh: /usr/local/cpanel/bin/rebuild_phpconf: No such file or directory"          
    print "suPHP is not installed on the server"
 elif
    print suphp

请注意我是编码和python的新手,并决定尝试使用python来管理一些服务器。

3 个答案:

答案 0 :(得分:2)

您似乎没有对shell=True执行任何有用的操作,因此您可以安全地完全跳过它:

try:
    suphp = subprocess.Popen(["/usr/local/cpanel/bin/rebuild_phpconf", "--current"], 
                             stdout=subprocess.PIPE,).communicate()[0]
except OSError:
    print "Couldn't start subprocess, suPHP is not installed on the server"

请注意,您必须将命令拆分为每个单独的参数,因为您没有shell为您执行此操作。你应该总是避免使用shell进行子进程,除非你绝对需要它(比如,因为你必须通过寻找脚本来设置你的环境)

答案 1 :(得分:0)

出乎我的意料:

比较运算符是== not =并且输出几乎总是后跟换行符。

所以尝试这样的事情:

if "No such file or directory" in suphp:
    ...

答案 2 :(得分:0)

在Unix中,有时需要考虑子进程可以将文本输出到两个不同的输出流。如果没有问题,例如echo hello,则会将文本发送到"standard output" stream

另一方面,对于将所有错误消息发送到"standard error" stream的过程,它被认为是一种良好的方式;例如stat /this-file-does-not-exist。您可以通过将所有标准输出发送到/dev/null来验证这一点。

运行此命令时,控制台上不会输出任何内容:

stat . > /dev/null

运行时,控制台上会出现 错误消息(因为文本来自标准错误流):

sh /this-program-does-not-exist > /dev/null

回到你的问题,“标准错误”流有时被称为“stderr”。可以使用Python的subprocess库使用POpen.stderr属性捕获此流中的文本。