Вы можете заменить все, что вы делаете, кодом Python, кроме вашей внешней утилиты. Таким образом, ваша программа останется переносимой, пока ваша внешняя утилита переносима. Вы также можете подумать о том, чтобы превратить программу C ++ в библиотеку и использовать Cython для взаимодействия с ней. Как показал Месса, date
заменяется на time.strftime
, глобализация выполняется с помощью glob.glob
, а cat
можно заменить на чтение всех файлов в списке и запись их на вход вашей программы. Вызов bzip2
можно заменить на модуль bz2
, но это усложнит вашу программу, потому что вам придется читать и писать одновременно. Для этого вам нужно либо использовать p.communicate
, либо поток, если данные огромны (select.select
будет лучшим выбором, но он не будет работать в Windows).
import sys
import bz2
import glob
import time
import threading
import subprocess
output_filename = '../whatever.bz2'
input_filenames = glob.glob(time.strftime("xyz_%F_*.log"))
p = subprocess.Popen(['filter', 'args'], stdin=subprocess.PIPE, stdout=subprocess.PIPE)
output = open(output_filename, 'wb')
output_compressor = bz2.BZ2Compressor()
def data_reader():
for filename in input_filenames:
f = open(filename, 'rb')
p.stdin.writelines(iter(lambda: f.read(8192), ''))
p.stdin.close()
input_thread = threading.Thread(target=data_reader)
input_thread.start()
with output:
for chunk in iter(lambda: p.stdout.read(8192), ''):
output.write(output_compressor.compress(chunk))
output.write(output_compressor.flush())
input_thread.join()
p.wait()
Дополнение: Как определить тип ввода файла
Вы можете использовать расширение файла или привязки Python для libmagic, чтобы определить, как файл сжимается. Вот пример кода, который выполняет оба действия и автоматически выбирает magic
, если он доступен. Вы можете взять часть, которая соответствует вашим потребностям и адаптировать ее к вашим потребностям. open_autodecompress
должен обнаружить кодировку MIME и открыть файл с соответствующим декомпрессором, если он доступен.
import os
import gzip
import bz2
try:
import magic
except ImportError:
has_magic = False
else:
has_magic = True
mime_openers = {
'application/x-bzip2': bz2.BZ2File,
'application/x-gzip': gzip.GzipFile,
}
ext_openers = {
'.bz2': bz2.BZ2File,
'.gz': gzip.GzipFile,
}
def open_autodecompress(filename, mode='r'):
if has_magic:
ms = magic.open(magic.MAGIC_MIME_TYPE)
ms.load()
mimetype = ms.file(filename)
opener = mime_openers.get(mimetype, open)
else:
basepart, ext = os.path.splitext(filename)
opener = ext_openers.get(ext, open)
return opener(filename, mode)