在Python中获取bash命令的所有输出

时间:2015-10-23 09:46:50

标签: python bash shell command-line

我有一个Python scrit,它让我检查PHP文件的语法。

我使用 subprocess.check_output 命令来调用bash命令,但它只返回显示响应的一半。

check_php.py 文件:

#!/usr/bin/python
# coding:utf-8
import os
import sys
import subprocess
import argparse
import fnmatch
import ntpath

path_base = os.path.dirname(os.path.realpath(__file__))

parser = argparse.ArgumentParser(
    description="This command checks the PHP syntaxe of files"
)
parser.add_argument('--path', '-p',
    help="Path for .php searching"
)
parser.add_argument('--file', '-f',
    help="Path of file to check"
)
args = parser.parse_args()

def check_php_file(path_file):
    command = 'php -l '+path_file
    sortie = ''
    try:
        sortie = subprocess.check_output(command, shell=True)
    except Exception as e:
        sortie = str(e)
    return sortie

if args.path:
    if args.path.startswith('/') or args.path.startswith('~'):
        path_base = args.path
    else:
        path_base = os.path.join(path_base, args.path)

if args.file:
    if args.file.startswith('/') or args.file.startswith('~'):
        path_file = args.path
    else:
        path_file = os.path.join(path_base, args.file)
    response = check_php_file(path_file)
    print("_____"+response+"_____")

checking.php 文件(语法错误):

<?php
if (true {
    echo "True";
}

检查PHP文件的命令:

python check_php.py -f checking.php

命令后显示的输出:

PHP Parse error:  syntax error, unexpected '{' in /home/jedema/checking.php on line 3
_____Command 'php -l /home/jedema/checking.php' returned non-zero exit status 255_____

因此,我的Python代码可以处理以下响应:

Command 'php -l /home/jedema/checking.php' returned non-zero exit status 255

但我想在String中得到以下回复:

PHP Parse error:  syntax error, unexpected '{' in /home/jedema/checking.php on line 3

您是否有任何想法获得完整回复?

编辑我已阅读以下问题:Get bash output with python

解决方案(灵感来自Salo回答)

安装Sh

pip install sh

通过添加这些导入来实现:

import sh

然后,使用check_php_file_method:

def check_php_file(path_file):
    sortie = ''
    try:
        sortie = sh.php('-l', path_file)
    except sh.ErrorReturnCode_255 as e:
        sortie = format(e.stderr)
    return sortie

2 个答案:

答案 0 :(得分:1)

我会使用sh来满足这些需求。 一个例子:

如果我有一个返回非零返回码的脚本并在stderr上打印一些像这样的名字(名为test_external_command.sh):

#!/bin/bash
>&2 echo "my Error on STDERR!"
exit 255

我想在变量中使用stderr我可以在Python脚本中使用sh模块,如下所示(名为checker.py):

import sh

def main():
    my_cmd = sh.Command('/path/to/test_external_command.sh')
    try:
        my_cmd()
    except sh.ErrorReturnCode_255 as e:
        print 'expected return code'
        print 'STDERR was: {}'.format(e.stderr)


if __name__ == '__main__':
    main()

您可以看到stderr已作为sh.ErrorReturnCode_255属性保存在stderr中。

希望这有帮助!

答案 1 :(得分:0)

使用subprocess.Popen,它返回输出元组和错误

child = subprocess.Popen(['php','-l', path_file], stdout=subprocess.PIPE, shell=True)
output, error = child.communicate()