Прочитать из файла, на который перенаправлен вывод моей программы - PullRequest
0 голосов
/ 05 декабря 2018

У меня есть программа на Python.Он выводит несколько строк.Я запускаю его как -

python process.py > output.txt

Во время выполнения process.py я хочу открыть output.txt из process.py и использовать сохраненные данные.

 with open("output.txt", 'r', encoding='utf-8') as template_file:
      template_file_content = template_file.readlines()
            for line in template_file_content:
                # use it

Есть ли способ сделать это.

Ответы [ 4 ]

0 голосов
/ 05 декабря 2018

Вы не должны делать это при запуске программы так, как вы это сделали - python process.py > output.txt. Измените способ, которым ваша программа принимает выходной файл, на python process.py output.txt.


При > output.txt ваша программа записывает в sys.stdout. Это не бизнес вашей программы, что происходит с этими данными дальше - это бизнес пользователя.Это интерфейс стандартных потоков, и вы подписываетесь на это при их использовании.
Даже если вы сможете каким-то образом устранить это ограничение, это нарушит интерфейс (что сделает вашу программу проблемной) и ненадежным (например,вывод может быть не в файл, а в любое другое количество возможных мест назначения в зависимости от ОС).

И наоборот, если вы примете выходной файл в качестве аргумента, нет никаких ограничений на то, что вам разрешенопоступайте с ним, пока ваша программа работает - помимо того, что вы сами гарантируете в документации к вашей программе.Например, если это «выходной файл», вы только обещаете пользователю, что после завершения вашей программы этот файл будет иметь свои «выходные данные».
Тем не менее, чтение из «выходного файла» все еще редкость,и вам нужно явно указать, что вы можете сделать это в справке вашей программы - потому что это означает, что пользователь должен убедиться, что адресат также бесконечно читаемый, а не просто записываемый (например, он может передать его именованная труба в противном случае).

0 голосов
/ 05 декабря 2018

Нет, результат перенаправления вывода не будет надежно доступен производственному процессу до его завершения.В частности, многие ОС будут применять буферизацию вывода, что означает, что файл гарантированно будет полностью записан только тогда, когда оболочка закроет дескриптор открытого файла, после завершения работы Python.

Возможным обходным решением может быть написаниеобертка для process.py и захватывает ее вывод в переменную и только затем записывает его в стандартный вывод.

Если вы можете изменить process.py, измените его на return или yield.выведите вызывающей стороне, если у него еще нет пути к коду, который делает это, затем просто import из своего кода вместо того, чтобы запускать его как отдельный процесс с перенаправлением.

0 голосов
/ 05 декабря 2018

Один из способов сделать это, вместо того, чтобы использовать данные из output.txt, это сохранить в списке в самой программе.Таким образом, вам не нужно иметь дело с конфликтом доступа к файлу.

Другой способ - поместить output.txt в качестве параметра в вашу программу на python и записать его изнутри программы.Закройте файл после завершения записи и откройте его снова, когда вы читаете из него.

0 голосов
/ 05 декабря 2018

Возможно, вам придется сначала сохранить (закрыть) файл, прежде чем пытаться получить доступ к данным внутри него.Возможно, вы захотите попробовать использовать вызовы os.system (), чтобы «прикоснуться» к файлу, то есть создать новый файл с именем «output.txt», затем написать, затем прочитать снова.

...