将subprocess.Popen的输出传递给if elif语句
我正在写一个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"
需要注意的是,你得把命令拆分成每个单独的参数,因为没有一个壳程序帮你处理这些。一般来说,除非你真的需要用到壳程序(比如需要通过一个脚本来设置环境),否则最好避免在子进程中使用它。