如何在python中使用os.execvp()重定向命令输出

时间:2016-04-27 09:39:16

标签: python shell

我在python中使用os.execvp()调用shell脚本。我的shell脚本有一些我想在文件中重定向的echo语句。

以下是我的尝试:

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

任何人都可以帮忙吗?

1 个答案:

答案 0 :(得分: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模块,该模块允许您在Py​​thon中重定向输出:

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)