我想將subprocess.call(...)
的輸出重定向到xz-或bzip2壓縮文件。記錄並壓縮subprocess.call的輸出
我想:
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正在做什麼。
謝謝!這個「沒有父母代碼」的東西很奇怪。我選擇使用純Python。 – Arno
@YdobEmos沒有什麼奇怪的,這是管道和重定向如何在shell中工作的:'command |另一個> output.txt 2>&1' – jfs
我覺得它不直觀,我希望我發送的數據在LZMA文件被寫入之前被壓縮。 (我在談論你的「沒有父代碼(與孩子的stdout/stderr有關)後運行(來自lzma模塊的Python代碼未運行)」句子)。 – Arno