Я пытаюсь объединить множество разных файлов журналов с одинаковыми именами и расположенными в разных каталогах. Имена файлов имеют форму fit_objectname.log, где objectname различается. Поскольку у меня их много, я пытаюсь выполнить это в цикле for внутри python, например:
import re
import glob
from subprocess import Popen, PIPE, STDOUT
new_logfiles = glob.glob('/Users/myusername/Desktop/subdir1/fit*.log')
for log in new_logfiles:
filename = re.search(r'(fit.+?\.log)', log)[1]
cmd = "cat /Users/myusername/Desktop/subdir1/{} /Users/myusername/Desktop/subdir2/{} >> {}_concat.log".format(filename, filename, filename[:-4])
p = Popen(cmd, shell=True, stdin=PIPE, stdout=PIPE, stderr=STDOUT, close_fds=True)
Однако конкатенация не работает. Результатом для каждого сохраненного файла fit_objectname_concat.log является просто содержимое файла журнала в subdir1.
Я изолировал свою проблему в цикле, поскольку, если я запускаю эту команду только для одной пары файлов (либо в терминале, либо в скрипте Python), она работает:
cmd = "cat /Users/myusername/Desktop/subdir1/fit_obj1.log /Users/myusername/Desktop/subdir2/fit_obj1.log > fit_obj1_concat.log"
p = Popen(cmd, shell=True, stdin=PIPE, stdout=PIPE, stderr=STDOUT, close_fds=True)
Я также пытался добавить оператор time.sleep(2) после каждой итерации в цикле, но у меня та же проблема. Есть идеи, что здесь может происходить?
Вероятно, это не дубликат, поскольку он не отвечает на ваш вопрос, но попробуйте используя вместо этого shutil.copyfileobj().






Если вы хотите использовать cat, почему бы просто не использовать сценарий оболочки? Или наоборот, если вы хотите использовать python, почему бы просто не использовать python? Почему вы извлекаете имя файла из пути только для того, чтобы распечатать его обратно? Почему вы используете регулярное выражение вместо
os.path? Все это выглядит скорее в стиле Руба-Голдберга.