Почему один и тот же код имеет разные результаты в Pycharm и Terminal? - PullRequest
1 голос
/ 02 апреля 2020

У меня два файла py, первый, a.py:

import asyncio


async def async_readline(proc: asyncio.subprocess.Process):
    while proc.returncode is None and not proc.stdout.at_eof():
        out = await proc.stdout.readline()
        print(F"OUT:{out}")

async def main():
    proc = await asyncio.create_subprocess_exec(
        *["python3", "b.py"],
        stdout=asyncio.subprocess.PIPE,
        stdin=asyncio.subprocess.PIPE,
        stderr=asyncio.subprocess.PIPE,
    )
    tasks = [
        asyncio.create_task(async_readline(proc)),
    ]
    done, pending = await asyncio.wait(
        tasks,
        timeout=4,
        return_when=asyncio.FIRST_COMPLETED
    )
    [i.cancel() for i in pending]
    print(f"done: {[i.result() for i in done]}")
    if proc.returncode is None:
        proc.kill()
    print(await proc.communicate())

    print(proc.returncode)


if __name__ == "__main__":
    asyncio.run(main())

, это основной файл. и другой файл b.py:

import time


print("start1")
print("start1")
print("start1")
time.sleep(1)
print("start1")
time.sleep(1)
print("start1")
time.sleep(1)
print("start1")
time.sleep(1)
print("start2")
print("start1")
time.sleep(1)
print("start2")
time.sleep(1)
print("start2")
print("start2")

time.sleep(1)
print("end")

Я запускаю a.py напрямую с pycharm, получил выходные данные:

OUT:b'start1\n'
OUT:b'start1\n'
OUT:b'start1\n'
OUT:b'start1\n'
OUT:b'start1\n'
OUT:b'start1\n'
done: []
(b'start2\nstart1\nstart2\nstart2\nstart2\nend\n', b'')
0

Затем я использовал ту же команду, что и pycharm в терминале , Я получаю такие результаты:

done: []
(b'start1\nstart1\nstart1\nstart1\nstart1\nstart1\nstart2\nstart1\nstart2\nstart2\nstart2\nend\n', b'')
0

Почему результаты разные?
Интерпретатор , тот же python и тот же код , но у них разные выходы. Я полагаю, что в run env есть что-то другое, но я не могу его найти и исправить.
Кстати, я думаю, что результаты pycharm-а соответствуют логике моего кода c.

Как получить те же выходы на терминале?
Заранее спасибо!

1 Ответ

1 голос
/ 02 апреля 2020

PyCharm имеет тенденцию устанавливать переменную окружения PYTHONUNBUFFERED , что приводит к немедленной записи вывода в стандартный вывод, в отличие от буферизации строки. Это похоже на то, что здесь происходит.

Если вы явно не укажете, значение передается вашему дочернему процессу.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...