如何将python OS系统调用重定向到文件?

时间:2015-06-05 00:54:35

标签: python plugins yum

我不知道为什么以下代码无效。文件arch_list不会被创建或写入任何内容。单独在终端中运行时,这些命令可以正常工作。

from yum.plugins import PluginYumExit , TYPE_CORE, TYPE_INTERACTIVE
import os

requires_api_version = '2.3'
plugin_type = (TYPE_CORE, TYPE_INTERACTIVE)

ip_vm = ['192.168.239.133']

def get_arch():
        global ip_vm
        os.system("uname -p > ~/arch_list")
        for i in ip_vm:
                cmd = "ssh thejdeep@"+i+" 'uname -p' >> ~/arch_list"
                print cmd
                os.system(cmd)

def init_hook(conduit):
        conduit.info(2,'Hello World !')
        get_arch()

2 个答案:

答案 0 :(得分:0)

在这种情况下,我认为os.system()不会返回stdout。您可以尝试使用带有适当参数的subprocess.call()。

编辑:实际上我想我记得在标准的bash循环中运行时看到与ssh类似的行为。您可以尝试在ssh调用中添加-n。我认为这是我多年前在bash中使用的解决方案。

我刚刚运行了你的代码,它可以正常工作,写入本地arch文件。我怀疑在列表中添加多个主机是您遇到问题的地方。你在运行什么版本的python?我在2.7.6。

答案 1 :(得分:0)

os.system()不会重定向stdout和stderr。

您可以使用子进程模块Popen将stdout和stderr设置为文件描述符或管道。

例如:

>>> import subprocess
>>> child1 = subprocess.Popen(["ls","-l"], stdout=subprocess.PIPE)
>>> print child1.stdout.readlines()

您可以将subprocess.PIPE替换为您为写入而打开的任何有效文件描述符。或者你可以拿起一些行到文件。这是你的电话。