2016-04-27 35 views
0

私はPythonでos.execvp()を使用してシェルスクリプトを呼び出しています。私のシェルスクリプトには、ファイルにリダイレクトしたい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

は 'は/ opt/Druva /回転数/ rpm_upgrade.sh'と'は/ opt/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が届きます1つではなく3つの議論。

それとも、あなたはPythonで出力をリダイレクトすることができますより多くのフル機能を備えたsubprocessモジュールに切り替えることができます。

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()" 長い間ハングアップします。誰でも助けてくれますか? –

関連する問題