Python:子流程的异常处理

Python:子流程的异常处理,python,msbuild,try-catch,subprocess,Python,Msbuild,Try Catch,Subprocess,我正在创建一个脚本来构建VisualStudio。这里是一个片段 try : subprocess.call('msbuild /m /verbosity:minimal %s\generate_rhapsody_all.vcxproj' % (bin), shell=True) except OSError : print 'ERROR: run vsvars32.bat first' 当msbuild给出错误时,该函数的输出为什么是 未将“msbuild”识别为内部或外部命

我正在创建一个脚本来构建VisualStudio。这里是一个片段

try :
    subprocess.call('msbuild /m /verbosity:minimal %s\generate_rhapsody_all.vcxproj' % (bin), shell=True)
except OSError :
    print 'ERROR: run vsvars32.bat first'
当msbuild给出错误时,该函数的输出为什么是

未将“msbuild”识别为内部或外部命令、可操作程序或批处理文件

而不是

错误:首先运行vsvars32.bat

但是当我删除shell=True时,try-catch工作正常。

如果shell为True,则指定的命令将通过shell执行。如果您使用Python主要是为了在大多数系统shell上提供增强的控制流,并且仍然希望方便地访问其他shell功能,例如shell管道、文件名通配符、环境变量扩展以及~到用户主目录的扩展,那么这将非常有用。"


如果shell=True,就好像在shell的上下文/环境中打开一个shell程序并执行命令一样,这将为您提供准确的msbuild is not recognized消息。但是,如果删除shell=True参数,子流程库将改为处理msbuild命令。

删除shell=True会导致另一个问题。如果remove shell=True,在此脚本之前运行的vsvars32.bat似乎没有全部运行。子流程库有许多功能可以帮助您完成您想做的事情,通常是获取输出等。您想做什么子流程可能无法提供?我明白了……不确定这是否有帮助: