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

标签 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。

最佳答案

欢迎来到 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 channel 并从中读取,这可以方便地以如下形式表示:

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

在此示例中,我选择将命令作为参数列表而不是简单的字符串给出。如果争论已经是列表形式,这可以避免将争论加入到字符串中。

请注意,当以这种方式与子进程交互时,子进程可能会进入阻塞状态,因为 stdout 或 stderr 已填满其输出缓冲区空间。如果您的程序尝试从另一个 channel 读取数据,则会造成死锁,其中每个进程都在等待另一个进程执行某些操作。为了避免这种情况,您可以将 stderr 设为临时文件,然后在子进程完成后验证该文件是否不包含任何重要内容(最好将其删除)。

关于python - 如何将 os 命令输出保存在文本文件中?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56224516/

相关文章:

Java : Problems accessing and writing to file

java - 如何在 Mac OS 的 Java 中获取 User ~/Library 路径

c - 如何在没有 stdio 的情况下为我的操作系统在 c 中创建 printf 函数?

python - Pygame 显示空白的白色窗口

python - 如何在 python 中创建概率条件流?

python - split ("\n") 和 splitlines() 都无法拆分字符串

java - 为什么在 Java 中将文件读入内存需要 4 倍的内存?

文件句柄变量?

c - 操作系统的核心(设备抽象级别)是否完全用 C 编写? (比如 : "UNIX is written in C")

python - 将 Python 对象存储在数据库中以便于查询