2016-04-27 68 views
0

我在python中使用os.execvp()調用shell腳本。我的shell腳本有一些echo語句,我想在文件中重定向。如何在python中使用os.execvp()重定向命令輸出

這裏就是我想:

cmd = "/opt/rpm/rpm_upgrade.sh >& /opt/rpm/upgrader.log" 
cmdline = ["/bin/sh", cmd] 
os.execvp(cmdline[0], cmdline) 

以下是錯誤我得到:

Error: /bin/sh: /opt/rpm/rpm_upgrade.sh >& /opt/rpm/upgrader.log: No such file or directory 

任何一個可以幫助?

+0

是'/選擇/ Druva /轉/ rpm_upgrade.sh'和'/選擇/ RPM /'存在? – alpert

+0

_沒有這樣的文件或目錄_ - 我想知道這可能意味着什麼?... –

+0

@alpert:是的。 rpm_upgrade.sh文件存在。這意味着/ opt/rpm /目錄也存在。 –

回答

1

發生這種情況,因爲你通過這個整個字符串就好像它是執行程序名稱:

"/opt/rpm/rpm_upgrade.sh >& /opt/rpm/upgrader.log" 

最簡單的辦法來解決這個問題是:

cmdline = ["/bin/sh", "/opt/rpm/rpm_upgrade.sh", 
      ">&", "/opt/rpm/upgrader.log"] 
os.execvp(cmdline[0], cmdline) 

現在sh將收到三個參數而不是一個參數。

或者你也可以切換到功能更全面的subprocess模塊,它可以讓你重定向輸出的Python:

import subprocess 
with open("/opt/rpm/upgrader.log", "wb") as outfile: 
    subprocess.check_call(["/opt/rpm/rpm_upgrade.sh"], shell=True, 
          stdout=outfile, stderr=subprocess.STDOUT) 
+0

它正在解決上述錯誤,但問題是此修復程序不會將我的rpm_upgrade.sh的echo語句重定向到/opt/rpm/upgrader.log文件。它仍然在控制檯上打印。 –

+0

@AmarPatil:我添加了一個更好的代碼片段來嘗試解決這個問題。 –

+0

當我使用代碼 「process = Popen(」rpm -Uvh /opt/rpm/new/client-4.1-5470.x86_64.rpm「,stdout = PIPE,shell = True) process.communicate()」 掛起很長時間。有人幫我在這裏? –

相關問題