python - 试图弄清楚如何将命令的输出保存到文件路径
问题描述
我可以在 python 脚本的提示符下运行命令,但我想将输出保存到特定文件。此脚本将提取目录列表:
import subprocess
subprocess.call('dir', shell=True)
并写入运行我的 python 程序的文件:
import sys
sys.stdout = open('badfile', 'w')
print('test')
但是,我试图将两者结合起来,以便将 Dir 命令的结果附加到指定位置的文件“badfile”中C:\users\idiot\somerandomdirectory
,而不仅仅是默认位置。
解决方案
将输出附加到文件
问:我正在尝试将两者结合起来,以便将 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,但想法是相似的。
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:
推荐阅读
- spring - 我们如何在 where 块中使用 hashmap 作为变量
- javascript - Sails.js 项目使用 passport.js 不会重定向到 twitter 登录
- perl - 列出目录中的文件并存储在数组中。该数组可以在循环外访问
- azure-application-insights - 为 AppInsight RestAPI 上下文设置时间跨度
- java - JsonPath:按数组中任何数组中的值过滤
- javascript - 未定义导出“MyModule” - 在 Jest 测试中
- javascript - d3 v5 轴比例更改平移方式太多
- python - 尝试下载 mysqlclient 时出现 gcc 错误
- node.js - 请解释 npx 限制 - 运行 npx mocha 时无法使用断言库
- matlab - 如何使这个 for 循环每次迭代都显示一个图形?