Man*_*bes 4 python subprocess python-3.x
我正在尝试在一组文件上执行Google的cpplint.py并将结果收集到一个日志文件中.但是,我还没有成功击败子进程模块.我目前的代码在这里:
import os, subprocess
rootdir = "C:/users/me/Documents/dev/"
srcdir = "project/src/"
with open(rootdir+srcdir+"log.txt", mode='w', encoding='utf-8') as logfile:
for subdir, dirs, files in os.walk(rootdir+srcdir):
for file in files:
if file.endswith(".h") or file.endswith(".cpp"):
filewithpath=os.path.join(subdir, file)
cmd=['c:/Python27/python.exe','C:/users/me/Documents/dev/cpplint.py','--filter=-whitespace,-legal,-build/include,-build/header_guard/', filewithpath]
output = subprocess.check_output(cmd)
logfile.write(output.decode('ascii'))
Run Code Online (Sandbox Code Playgroud)
尝试运行上面的代码会引发错误:
File "C:\Python32\lib\site.py", line 159
file=sys.stderr)
^ SyntaxError: invalid syntax Traceback (most recent call last): File "C:\Users\me\Documents\dev\project\src\verifier.py", line 19, in <module>
output = subprocess.check_output(cmd) File "C:\Python32\lib\subprocess.py", line 511, in check_output
raise CalledProcessError(retcode, cmd, output=output) subprocess.CalledProcessError: Command '['c:/Python27/python.exe', 'C:/users/me/Documents/dev/cpplint.py', '--filter=-whitespace,-legal,-build/include,-build/header_guard/', 'C:/users/me/Documents/dev/project/src/aboutdialog.cpp']' returned non-zero exit status 1
Run Code Online (Sandbox Code Playgroud)
如果我用更简单的东西代替cmd:
cmd=['C:/WinAVR-20100110/bin/avr-gcc.exe','--version']
Run Code Online (Sandbox Code Playgroud)
然后脚本按预期工作.
我也尝试使用单个命令字符串而不是字符串列表作为cmd,但结果是相同的.在调试代码时,我从调试器复制了list-of-strings-turned-into-the-command-line-command并在Windows命令行中运行它,命令按预期运行.
运行我的脚本的Python解释器是Python 3.2.任何提示都非常感谢.
bjl*_*aub 11
看起来cpplint.py只是简单地退出非零返回代码 - 例如,如果它在它正在检查的源文件中发现错误或"lint",它可能会这样做.
请参阅subprocess.check_output的文档.请注意,如果执行的命令返回非零退出代码,则subprocess.CalledProcessError引发a.
你可以通过观察来解决它CalledProcessError,例如
try:
output = subprocess.check_output(cmd)
except subprocess.CalledProcessError as e:
# ack! cpplint.py failed... report an error to the user?
Run Code Online (Sandbox Code Playgroud)
编辑:
这SyntaxError似乎是关键,可能是由于C:\Python32\lib你的PYTHONPATH(显式,或者,如果它是你当前的工作目录,这可能会发生).
Python解释器(大约1.5.2-ish)import site在启动时自动运行.因此,在这种情况下,您的脚本将执行:
c:/Python27/python.exe C:/users/me/Documents/dev/cpplint.py ...
Run Code Online (Sandbox Code Playgroud)
然后Python 2.7解释器将C:\Python32\lib\site.py首先找到,并尝试加载,而不是一个(大概)C:\Python27\lib\site.py.问题在于Python 3 site.py包含与Python 2不兼容的语法,因此启动的进程subprocess.check_output在它甚至有机会运行之前就会失败并出现一个SyntaxError cpplint,这会传播CalledProcessError.
解?确保Python2获得了真正的Python2"PYTHONPATH",同样适用于Python3!换句话说,C:\Python32\lib运行Python2解释器时,请确保不在PYTHONPATH搜索路径中.
在您的情况下执行此操作的一种方法是在启动流程时设置显式环境,例如:
python2_env = {"PYTHONPATH": "path/to/python2/stuff:..."}
output = subprocess.check_output(cmd, env=python2_env)
Run Code Online (Sandbox Code Playgroud)