2013-01-02 85 views
1

我遇到了這個問題,其中下面的命令通過python腳本失敗,如果我嘗試手動運行此命令在任何它通過的Linux機器上的命令行上,只能通過腳本它是失敗的,任何輸入什麼是錯誤的地方或提示調試?命令失敗,通過python腳本,但手動工作

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 
+0

'哪個午餐'的輸出是什麼?您應該使用腳本中的完整路徑。 –

+0

@DiegoBasch - 它不是一個unix實用程序..它是一個本地腳本,所以哪個午餐不會給任何東西 – user1927396

+0

'哪個'不僅僅適用於unix實用程序。它會搜索你的PATH的可執行文件。 –

回答

0

你實際上應該使用th是:

import shlex 
from subprocess import Popen 

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

由於12是一個命令的變量的lunch,而不是一部分,shlex將自動拆分命令及其參數的照顧。

你應該通過Popen列表,當你有一個命令和參數在一起。確保你真的需要shell=True?你知道嗎what it actually does

+1

你說過:「當你有一個命令和參數時,你應該把Popen列出來。」shlex如何做到這一點?午餐12也是一個命令和論點,對嗎? – user1927396

+0

其實我只是意識到在運行午餐命令之前,「午餐」是正在運行的shell腳本中的函數名稱(更新了腳本的問題),所以此shell腳本將午餐功能添加到環境中......我可以看到shell腳本是成功的,所以不知道爲什麼午餐命令失敗 - – user1927396

+0

這是因爲通過調用不保留環境(請注意,'source'是一個雙擊,並且您正在使用'sh'運行命令)。 –

1

由於lunchbuild/envsetup.sh定義一個bash功能,您既可以創建調用lunch 12前源build/envsetup.sh bash腳本,或者你可以有Popen執行bash命令如

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="[email protected]"; firefox "www.google.com/search?q=${KEY}" ; }') 
proc = subprocess.Popen(shlex.split('bash -c "source /tmp/envsetup.sh && lunch stackoverflow"')) 
proc.communicate() 
+0

Popen可以同時採用字符​​串和列表,但是當你傳入參數時(如這裏的情況),最好將它們作爲一個列表,以便可以正確完成shell轉義。 –

相關問題