web-dev-qa-db-fra.com

sous-processus "TypeError: un objet de type octet est requis, pas" str "" (Python 2 -> 3 peut-être?)

J'utilise ce code de une question déjà posée il y a quelques années , mais je pense que c'est obsolète. En essayant d'exécuter le code, je reçois l'erreur ci-dessus. Je suis toujours novice en python, je ne peux donc pas obtenir beaucoup de précisions à partir de questions similaires. quelquun sait pourquoi cela se passe?

import subprocess

def getLength(filename):
  result = subprocess.Popen(["ffprobe", filename],
    stdout = subprocess.PIPE, stderr = subprocess.STDOUT)
  return [x for x in result.stdout.readlines() if "Duration" in x]

print(getLength('bell.mp4'))

Traceback

Traceback (most recent call last):
  File "B:\Program Files\ffmpeg\bin\test3.py", line 7, in <module>
    print(getLength('bell.mp4'))
  File "B:\Program Files\ffmpeg\bin\test3.py", line 6, in getLength
    return [x for x in result.stdout.readlines() if "Duration" in x]
  File "B:\Program Files\ffmpeg\bin\test3.py", line 6, in <listcomp>
    return [x for x in result.stdout.readlines() if "Duration" in x]
TypeError: a bytes-like object is required, not 'str'
7
chatbottest

subprocess renvoie les objets bytes pour les flux stdout ou stderr par défaut. Cela signifie que vous devez également utiliser des objets bytes dans les opérations sur ces objets. "Duration" in x utilise l'objet str. Utilisez un littéral d'octets (notez le préfixe b):

return [x for x in result.stdout.readlines() if b"Duration" in x]

L’autre solution consiste à indiquer à subprocess.Popen() de décoder les données en chaînes Unicode en définissant l’argument encoding sur un codec approprié:

result = subprocess.Popen(
    ["ffprobe", filename],
    stdout=subprocess.PIPE, stderr = subprocess.STDOUT,
    encoding='utf8'
)
14
Martijn Pieters

Comme le dit l'errror, "Durée" est une chaîne. Considérant que, le X est un objet semblable à un octet, puisque results.stdout.readlines() lit les lignes dans la sortie en tant que bytecode et pas chaîne.

Par conséquent, stockez "Durée" dans une variable, dites str_var et encodez-la dans un objet tableau d'octets à l'aide de str_var.encode('utf-8').

Reportez-vous à [this] [1].

[1]: Le meilleur moyen de convertir une chaîne en octets dans Python 3?

0
Harshith Thota