2016-04-27 72 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()” 挂起很长时间。有人帮我在这里? –

相关问题