Похоже, cpplint.py
просто завершает работу с ненулевым кодом возврата - что может произойти, например, если он обнаружит ошибки или "ошибки" в исходных файлах, которые он проверяет.
См.документация для subprocess.check_output .Обратите внимание, что если выполненная команда возвращает ненулевой код выхода , то вызывается subprocess.CalledProcessError
.
Вы можете обойти это, наблюдая за CalledProcessError
, например:
try:
output = subprocess.check_output(cmd)
except subprocess.CalledProcessError as e:
# ack! cpplint.py failed... report an error to the user?
РЕДАКТИРОВАТЬ :
Кажется, что SyntaxError
здесь, и, вероятно, это вызвано тем, что C:\Python32\lib
находится в вашей PYTHONPATH (либо явно, либо, это может произойти, если это ваш текущий рабочий каталог).
Интерпретатор Python (начиная с версии 1.5.2)) автоматически запускается import site
при запуске.Таким образом, когда это так, и ваш сценарий выполняется:
c:/Python27/python.exe C:/users/me/Documents/dev/cpplint.py ...
, тогда интерпретатор Python 2.7 сначала найдет C:\Python32\lib\site.py
и попытается загрузить его вместоодин (предположительно) на C:\Python27\lib\site.py
.Проблема заключается в том, что site.py
в Python 3 содержит синтаксис, несовместимый с Python 2, поэтому процесс, запущенный subprocess.check_output
, завершается с ошибкой SyntaxError, прежде чем он даже получит шанс запустить cpplint
, который распространяет CalledProcessError
.
Решение?Убедитесь, что Python2 получает истинный Python2 "PYTHONPATH", а также для Python3!Другими словами, убедитесь, что C:\Python32\lib
не находится в пути поиска PYTHONPATH при запуске интерпретатора Python2.
Один из способов сделать это в вашем случае - установить явную среду при запуске процесса, например:
python2_env = {"PYTHONPATH": "path/to/python2/stuff:..."}
output = subprocess.check_output(cmd, env=python2_env)