我正在使用popen在windows vm 上运行以下命令
'f变更集…'
但是当我使用运行它时
commandLine = 'tf changeset /noprompt /latest /loginType:OAuth /login:.,***'
process = Popen(commandLine, shell=True, stdout=PIPE, stderr=PIPE)
我在日志中看到以下内容正在执行
'C:\Azure\Agent-1/externals/tf/tf变更集…'
这意味着"C:\Azure\Agent-1/externals/tf/"已准备好用于我的命令。我只是期待看到
'f变更集…'
不幸的是,添加执行路径会中断命令,有什么方法可以阻止python这样做吗?
尝试将commandLine
作为参数列表传递给Popen
:
commandLine = ["tf", "changeset", "/noprompt", "/latest", "/loginType:OAuth", "/login:.,***'"]
process = Popen(commandLine, stdout=PIPE, stderr=PIPE)
Python本身并没有做这样的事情。也许shell=True
做得比你希望或期望的要多?但我们需要访问您的shell配置,以超越对此的猜测。
对来自Popen
的结果调用Popen
显然没有定义明确;但也许这只是你转录真实代码时的一个错误?
删除第一个process =Popen(
将以最小的更改来修复此问题。根据以上内容,我也会删除shell=True
,因为它至少是多余的,最坏的情况是直接有害的。
commandLine = 'tf changeset /noprompt /latest /loginType:OAuth /login:.,***'
process = Popen(commandLine, stdout=PIPE, stderr=PIPE)
就像subprocess
文档告诉您的那样,只有当您的命令是内置的cmd
时,shell=True
才在Windows上有用。
为了实现适当的可移植性,如果您懒惰或需要用户传入字符串来执行,则应手动或通过shlex.split()
将命令分解为令牌。
commandLine = ['tf ', 'changeset', '/noprompt', '/latest', '/loginType:OAuth', '/login:.,***']
process = Popen(commandLine, stdout=PIPE, stderr=PIPE)
这避免了shell=True
的其他危险,并且可以移植到非Windows平台(当然,假设您尝试运行的命令在目标平台上可用(。