首页 > 解决方案 > 试图弄清楚如何将命令的输出保存到文件路径

问题描述

我可以在 python 脚本的提示符下运行命令,但我想将输出保存到特定文件。此脚本将提取目录列表:

import subprocess
subprocess.call('dir', shell=True)

并写入运行我的 python 程序的文件:

import sys
sys.stdout = open('badfile', 'w')
print('test')

但是,我试图将两者结合起来,以便将 Dir 命令的结果附加到指定位置的文件“badfile”中C:\users\idiot\somerandomdirectory,而不仅仅是默认位置。

标签: python

解决方案


将输出附加到文件

:我正在尝试将两者结合起来,以便将 Dir 命令的结果附加到文件“badfile”中

A. Python 的答案在这个下面...

命令行方式...

这可以在 python 中完成,但可能有更简单的方法来实现你想要的。这是一个需要考虑的问题:

通常的方法是使用命令提示符或 shell 来做这些事情。您仍然可以使用 python 脚本执行操作,但随后您从命令提示符运行它并将输出发送到其他地方。最简单的方法,即专为这种确切情况设计的方法,是使用“重定向”。您“捕获”程序或脚本的输出并将其发送到其他地方。这个过程称为“重定向”。

这是为您的示例执行此操作的方法:

C:\myfolder> dir *.* >> C:\some\random\directory\badfile.txt

如果您想在发送文本之前删除文件,您可以使用单个 > 符号而不是 >> 符号。


重定向

您的示例的一般语法是:

COMMAND >> FILENAME(将 COMMAND 输出附加到 FILENAME 的末尾)

COMMAND 和 FILENAME 之间的 >> 符号是“重定向运算符”


重定向操作符是一个特殊字符,可以与命令(如命令提示符命令或 DOS 命令)一起使用,以将输入重定向到命令或命令的输出。

默认情况下,当您执行命令时,输入来自键盘,输出发送到命令提示符窗口。命令输入和输出称为命令句柄。

这里有些例子:

   command > filename        Redirect command output to a file

   command >> filename       APPEND into a file

   command < filename        Type a text file and pass the text to command

   commandA  |  commandB     Pipe the output from commandA into commandB

   commandA &  commandB      Run commandA and then run commandB

   commandA && commandB      Run commandA, if it succeeds then run commandB

   commandA || commandB      Run commandA, if it fails then run commandB

我现在主要使用 macOS,但想法是相似的。

这是 Windows 的备忘单。

这是 Linux 和 macOS 的备忘单。


Pythonic 方式

至于 python,请执行以下操作:

import subprocess

with open('C:/temp/badfile.txt', mode='at',) as f: 
    f.write(subprocess.check_output(['dir','*.*']).decode())

那里。完毕。Python 真的很棒。

要让程序接受任何命令行参数并将结果写入 sp.log,如下所示:

sp dir *.* /w

创建一个名为 sp 的 python 脚本,如下所示:

#!/usr/bin/env python3
# -*- coding: UTF-8 -*-

from subprocess import check_output
from sys import argv

if len(argv) > 1:
    with open('sp.log', mode='at',) as f:
        try:
            f.write(check_output(argv[1:]).decode())
        except Exception as e:
            print(e)

您还可以添加很多其他内容,例如检查默认编码、使其适用于 windows/macOS/linux、添加错误检查、添加调试信息、添加命令行选项......

这是我拼凑起来玩的更长更详细版本的 GIST:

https://gist.github.com/septycal


推荐阅读