如何将os命令输出保存在文本文件中?

时间:2019-05-20 16:03:24

标签: python file operating-system system

我正在尝试编写一个使用os命令(Linux)的脚本,并将其保存在文本文件中。但是,当我尝试运行此代码时,os命令的输出未保存在文本文件中。

#!/usr/bin/python
import sys
import os


target = raw_input('Enter the website : ')
ping_it = os.system('ping ' + target)
string_it = str(ping_it)

with open("Output.txt", "w+") as fo:
        fo.write(string_it)
        fo.close()

运行脚本后,当我检查txt文件时,我得到的唯一输出就是Output.txt中的2。

3 个答案:

答案 0 :(得分:2)

欢迎使用Stackoverflow。

这里的主要问题是os.system并非旨在从命令中产生输出-它只是运行它,并且该过程将其输出发送到它从其父项(您的程序)继承的任何内容。

要捕获输出,最简单的方法是使用subprocess模块,该模块可让您捕获流程的输出。

这是一个相当简单的程序,可以帮助您入门:

import subprocess

target = 'google.com'
ping_it = subprocess.Popen('ping ' + target,
                           stdout=subprocess.PIPE,
                           stderr=subprocess.PIPE)
out, err = ping_it.communicate()

with open("Output.txt", "w+") as fo:
        fo.write(str(out))
        fo.close()

如果要在生成输出时读取输出,而不是等待子进程终止,则可以使用单个subprocess.PIPE通道进行读取,可以方便地以如下形式表示:

with Popen(["ping", "google.com"], stdout=PIPE) as proc:
    print(proc.stdout.read())

在此示例中,我选择将命令作为参数列表而不是简单字符串给出。这样就避免了必须将论据以列表形式加入到字符串中的情况。

请注意,以这种方式与子流程进行交互时,子流程有可能进入阻塞状态,因为stdout或stderr都已填满其输出缓冲区空间。如果您的程序随后尝试从另一个通道读取将创建死锁,则每个进程都在等待另一个进程做死。为避免这种情况,您可以将stderr制成一个临时文件,然后在子进程完成后验证该文件不包含任何重要内容(最好将其删除)。

答案 1 :(得分:0)

您到底要保存在文件中什么?您 did 保存this is not my name的输出,只不过是执行的最终状态。这正是文档告诉您的是该命令的返回值。

如果要输出os.command命令,则需要使用专注于ping而不是ping的内容。简单的方法是添加UNIX重定向:

os.command

如果您需要通过Python传递结果,请使用单独的过程并接收命令结果; see here

您还可以生成单独的过程,并逐行检查结果的产生情况。您似乎不需要,但以防万一,请参阅我自己的问题here

答案 2 :(得分:0)

From docs,您可以使用os.popen将任何命令的输出分配给变量。

import os
target = raw_input('Enter the website : ')

output = os.popen('ping ' + target).read()   # Saving the output

with open('output.txt', 'w+') as f:
    f.write(output)