从传递输出子流程.Popen给一个如果是埃利夫的政治家

2024-10-01 04:51:29 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在创建一个python脚本来检查suPHP我正在尝试创建一个if-else语句来声明suPHP是否在服务器上,使用的输出来自子流程.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来管理一些服务器。在


Tags: 服务器脚本ifbinusrlocalelsesubprocess
3条回答

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

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

运行此命令时,您的控制台上没有输出:

stat . > /dev/null

运行此程序时,控制台上将出现一条错误消息(因为文本来自标准错误流):

^{pr2}$

回到您的问题,“标准错误”流有时称为“stderr”。这个流中的文本可以使用Python的subprocess库使用^{}属性捕获。在

在我脑海里:

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

所以试试这样的方法:

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

您似乎没有使用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用于子进程(例如,因为您必须通过源代码脚本来设置环境)

相关问题 更多 >