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'
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'
)
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?