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 に答える