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

0 投票
3 回答
755 浏览
提问于 2025-04-17 03:03

我正在写一个Python脚本,用来检查服务器上是否启用了suPHP。我想创建一个if else语句,根据subprocess.Popen的输出判断suPHP是否在服务器上。

在我发这个帖子之前,我已经用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

在Unix系统中,有时候你需要注意,子进程可以把文本输出到两个不同的地方。当一切正常时,比如用 echo hello 这个命令,文本会被发送到一个叫做“标准输出”的地方。

另一方面,程序把错误信息发送到“标准错误”流是比较礼貌的做法;比如说用 stat /this-file-does-not-exist 这个命令。你可以通过把所有标准输出发送到 /dev/null 来验证这一点。

当你运行这个命令时,你的控制台上不会有任何输出:

stat . > /dev/null

但是当你运行这个命令时,控制台上会出现一个错误信息 (因为这个文本来自标准错误流)

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

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

0

我随便说说:

比较运算符是 == 而不是 =,而且输出几乎总是会跟一个换行符。

所以可以试试这样:

if "No such file or directory" in suphp:
    ...
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"

需要注意的是,你得把命令拆分成每个单独的参数,因为没有一个壳程序帮你处理这些。一般来说,除非你真的需要用到壳程序(比如需要通过一个脚本来设置环境),否则最好避免在子进程中使用它。

撰写回答