Рассмотрим этот фрагмент:
from subprocess import Popen, PIPE, CalledProcessError
def execute(cmd):
with Popen(cmd, shell=True, stdout=PIPE, bufsize=1, universal_newlines=True) as p:
for line in p.stdout:
print(line, end='')
if p.returncode != 0:
raise CalledProcessError(p.returncode, p.args)
base_cmd = [
"cmd", "/c", "d:\\virtual_envs\\py362_32\\Scripts\\activate",
"&&"
]
cmd1 = " ".join(base_cmd + ['python -c "import sys; print(sys.version)"'])
cmd2 = " ".join(base_cmd + ["python -m http.server"])
Если я запустил execute(cmd1)
, вывод будет распечатан без каких-либо проблем.
Однако, если я запустил execute(cmd2)
, то ничего не будет напечатано, почему это так и как я могу его исправить, чтобы я мог видеть выход http.server в реальном времени.
Также, как for line in p.stdout
оценивается внутри? это какая-то бесконечная петля до достижения цели или чего-то еще?
Этот раздел уже был рассмотрен несколько раз здесь, в SO, но я еще не нашел решение для Windows. Вышеприведенный фрагмент фактически является кодом из этого и пытается запустить http.server из virtualenv (python3.6.2-32bits на win7)