Почему при использовании subprocess выводит непонятные символы?

Какое значение имеет вывод команды subprocess.call(["ping", "www.youtube.com"]) и как его интерпретировать?
  • 10 декабря 2023 г. 11:56
Ответы на вопрос 4
При использовании модуля subprocess для выполнения команды внешней программы, некоторые программы могут использовать кодировку, отличную от кодировки вашей консоли. Это может привести к выводу непонятных символов.

Чтобы исправить эту проблему, можно указать явно кодировку, используемую программой. Например, можно добавить аргумент `encoding='utf-8'` при вызове `subprocess.Popen`:

```python
import subprocess

process = subprocess.Popen(["ping", "www.youtube.com"], stdout=subprocess.PIPE, encoding='utf-8')
output, error = process.communicate()
print(output)
```

---

Значение вывода команды `subprocess.call(["ping", "www.youtube.com"])` - это статус завершения выполнения команды. Если значение равно 0, это означает, что команда была выполнена успешно. Иначе, если значение ненулевое, то возможно произошла ошибка. Это значение может помочь вам определить, была ли команда выполнена успешно или нет. Но вывод команды не доступен с помощью `subprocess.call`, для этого нужно использовать другие методы, например, `subprocess.check_output`.
subprocess.run() совмещает стандартный вывод твоего скрипта и вызываемого тобой процесса. Если они используют разные кодировки, чей-то вывод превратится в кашу. 
Используй capture_output, тогда ты получишь вывод скрипта в виде строки, которую сможешь сам декодировать, если надо.

Либо:


PING www.youtube.com (2a00:1450:4010:c06::c6) 56(84) bytes of data.
64 bytes from wide-youtube.l.google.com (2a00:1450:4010:c06::c6): icmp_seq=1 ttl=56 time=131 ms
64 bytes from wide-youtube.l.google.com (2a00:1450:4010:c06::c6): icmp_seq=2 ttl=56 time=88 ms
64 bytes from wide-youtube.l.google.com (2a00:1450:4010:c06::c6): icmp_seq=3 ttl=56 time=327 ms
64 bytes from wide-youtube.l.google.com (2a00:1450:4010:c06::c6): icmp_seq=4 ttl=56 time=86 ms

--- www.youtube.com ping statistics ---
4 packets transmitted, 4 received, 0% packet loss, time 2999ms
rtt min/avg/max/mdev = 86/192/327/115 ms
Сам решил, вот решение: 
con_out = subprocess.check_output(["ping", "www.youtube.com"], shell=True).decode('cp866')
print(con_out)
Похожие вопросы