Sth неправильно с python типами / печать в Popen ошибка - PullRequest
1 голос
/ 08 января 2020

Хорошо, я наслаждался с python подпроцессом. Откройте и обнаружил одну странную вещь:

OnlineListener = subprocess.Popen(("python", prog_dir + "online.py", prog_dir, port),
                                  shell=True,
                                  stdout=None,
                                  stdin=subprocess.PIPE)

print(b"f", file=OnlineListener.stdin, flush=True)

Но я получил странную ошибку:

Traceback (most recent call last):
  File "C:/##########/PycharmProjects/#####/main.py", line 53, in <module>
    processes = run_proc()
  File "C:/##########/PycharmProjects/#####/main.py", line 27, in run_proc
    print(b"f", file=OnlineListener.stdin, flush=True)
TypeError: a bytes-like object is required, not 'str'

как в байтах требуется объект, а не 'str'

Я думал, что ошибка связана с b"f", но на самом деле:

print(type(b'f')) # return: <class 'bytes'>

Может кто-нибудь помочь мне с этим?
UPD. Может быть, мне не нужен ответ на этот вопрос, но просто посмотрите на это:

    scoper.stdin.write("end\n".encode())
TypeError: write() argument must be str, not bytes
################## НО ########################.
    scoper.stdin.write("end\n")
TypeError: a bytes-like object is required, not 'str'

1 Ответ

1 голос
/ 08 января 2020

Функция print всегда обрабатывает данный файловый объект как текстовый поток, и вызов print с b'f' просто выведет "b'f'" как текст. Но Popen.stdin был бы потоком байтов, если не указан аргумент encoding, который вы не указали, поэтому при печати чего-либо к нему может произойти указанная ошибка.

Чтобы исправить это Вы можете использовать аргумент encoding при инициализации Popen:

OnlineListener = subprocess.Popen("python",
                                  shell=True,
                                  stdout=None,
                                  stdin=subprocess.PIPE,
                                  encoding='utf-8')

или использовать метод write вместо print:

OnlineListener.stdin.write(b'f\n')
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...