Popen预写可执行文件的路径



我正在使用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平台(当然,假设您尝试运行的命令在目标平台上可用(。

相关内容

最新更新