python – 记录并压缩subprocess.call的输出
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了python – 记录并压缩subprocess.call的输出,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含1627字,纯文字阅读大概需要3分钟。
内容图文
![python – 记录并压缩subprocess.call的输出](/upload/InfoBanner/zyjiaocheng/780/5e8b58db59654ab098083960c548a706.jpg)
我想将subprocess.call(…)的输出重定向到xz或bzip2压缩文件.
我试过了 :
with lzma.open(log_path, "x") as log_file:
subprocess.call(command, stdout=log_file, stderr=log_file)
但生成的文件不是有效的XZ压缩文件:
$xzcat logfile.xz
xzcat : logfile.xz: Format de fichier inconnu
(用法语表示“未知文件格式”).
当我只使用cat时,文件显示正确,最后有一些奇怪的数据(在脚本中启动的命令是rsync):
& cat logfile.xz
sending incremental file list
prog/testfile
sent 531.80K bytes received 2.71K bytes 1.07M bytes/sec
total size is 14.21G speedup is 26,588.26
?7zXZ??F?D!??}YZ
logfile.xz似乎是一个半有效的XZ存档文件,填充了未压缩的数据.我究竟做错了什么 ?
PS:当我做那样的事情时它会起作用:
output = subprocess.check_output(command)
log_file.write(output)
…但鉴于该命令需要很长时间(它是一个备份脚本),我希望能够在结束前看到日志(使用xzcat),以了解rsync正在做什么.
解决方法:
在子项被执行之前,重定向发生在文件描述符级别:之后没有运行父代码(与子代的stdout / stderr相关)(不运行来自lzma模块的Python代码).
要动态压缩以便在子进程仍在运行时可以看到输出,您可以将其输出重定向到xz实用程序:
#!/usr/bin/env python3
import subprocess
with open('logfile.xz', 'xb', 0) as log_file:
subprocess.call("command | xz -kezc -", shell=True,
stdout=log_file, stderr=subprocess.STDOUT)
注意:使用普通的open(),而不是lzma.open():压缩是在xz子进程中完成的.
如果你想在纯Python代码中压缩,那么你必须通过python管道数据:
#!/usr/bin/env python3
import lzma
from subprocess import Popen, PIPE, STDOUT
from shutil import copyfileobj
with lzma.open('logfile.xz', 'xb') as log_file, Popen('command', stdout=PIPE, stderr=STDOUT) as process:
copyfileobj(process.stdout, log_file)
注意:使用lzma.open().
内容总结
以上是互联网集市为您收集整理的python – 记录并压缩subprocess.call的输出全部内容,希望文章能够帮你解决python – 记录并压缩subprocess.call的输出所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。