os.popen и запись в терминале отличаются

#python #bash #windows-subsystem-for-linux

#python #bash #windows-subsystem-for-linux

Вопрос:

Я пишу шаблон для стресс-тестирования своих программ. Где находится файл gen.py (он должен был быть создателем теста):

 print(1)
  

Если я пишу в терминале Linux python3 gen.py > test.txt — python печатает 1 в файл.

Где также находится файл stress.py (этот файл изначально должен запускать основную программу много раз).

 import os
os.popen('python3 gen.py > test.txt')
print(*os.popen('cat test.txt').readlines())
  

Ожидается, что результат будет «1», но ни в выходных данных, ни в файле test.txt ничего нет . Я запускаю Linux Ubuntu, используя WSL в Windows. Возможно, это на что-то влияет.

Комментарии:

1. os.popen() просто запускает процесс. Вы не дождались завершения первого, прежде чем второй попытался прочитать его вывод.

2. Да, теперь это сработало. Как я могу дождаться завершения предыдущего popen?

3. os.popen() на самом деле не подходит, когда вы не вводите ввод или не ожидаете вывода от команды. os.system() здесь было бы лучше работать с первой командой (она не возвращается, пока команда не будет выполнена), но лучшие варианты находятся в subprocess модуле — вы можете избежать запуска бесполезной (и небезопасной) оболочки и можете предоставлять параметры, не беспокоясь о том, содержат ли они какие-либо символы, которые нужно было бы заключить в кавычки.

Ответ №1:

Самый быстрый способ сделать это — вы должны написать os.popen(...).read() . Таким образом .read() , будет ждать, пока функция не завершится.