我在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
任何人都可以帮忙吗?
答案 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
模块,该模块允许您在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)