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



我不知道为什么下面的代码不工作。文件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()

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

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

我刚刚运行了你的代码,它对我来说工作得很好,写入本地arch文件。我怀疑在您的列表中添加多个主机是您开始遇到问题的地方。你运行的是什么版本的python ?我是2.7.6。

os.system()不会重定向标准输出和标准错误。

可以使用子进程模块Popen将标准输出和标准错误设置为文件描述符或管道。

例如:

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

您可以将subprocess.PIPE替换为您打开的任何有效的文件描述符。或者你可以选择文件中的一些行。

最新更新