1

我遇到了这个问题,下面的命令通过 python 脚本失败,如果我尝试在它通过的任何 linux 机器上的命令行上手动运行这个命令,只能通过失败的脚本,这里有什么错误的输入或调试技巧?

source= Popen(['source build/envsetup.sh'],stdout=PIPE,stderr=PIPE, shell=True)
stdout,stderr=source.communicate()
print stdout
print stderr
lunchcommand=Popen(['lunch 12'],stderr=PIPE,shell=True)
stdout,stderr= lunchcommand.communicate()
print "Printing lunch stdout and stderr"
print stderr

/bin/sh: lunch: command not found
4

2 回答 2

1

由于lunch是在 中定义的 bash 函数,您可以在调用之前build/envsetup.sh创建一个 bash 脚本,或者您可以执行一个 bash 命令,例如build/envsetup.shlunch 12Popen

bash -c "source /tmp/envsetup.sh && lunch 12"

例如:

import subprocess
import shlex

with open('/tmp/envsetup.sh', 'w') as f:
    f.write('function lunch() { KEY="$@"; firefox "www.google.com/search?q=${KEY}" ; }')
proc = subprocess.Popen(shlex.split('bash -c "source /tmp/envsetup.sh && lunch stackoverflow"'))
proc.communicate()
于 2013-01-02T05:04:52.587 回答
0

你实际上应该使用这个:

import shlex
from subprocess import Popen

the_command = '/path/to/lunch 12'
result = Popen(shlex.split(the_command))

由于12是命令的参数lunch而不是命令的一部分,因此shlex将自动处理拆分命令及其参数。

Popen当您同时拥有命令和参数时,您应该传递一个列表。确定你真的需要shell=True吗?你知道它实际上是做什么的吗?

于 2013-01-02T05:16:41.757 回答