我有一个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
安装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
答案 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()