wake-up-neo.com

subprozess "TypeError: Ein bytesähnliches Objekt ist nicht" str "erforderlich" (Python 2 -> 3 Ausgabe möglicherweise?)

Ich verwende diesen Code von einer zuvor gestellten Frage vor ein paar Jahren , jedoch glaube ich, dass dies veraltet ist. Beim Versuch, den Code auszuführen, erhalte ich den obigen Fehler. Ich bin immer noch ein Neuling in Python, daher konnte ich aus ähnlichen Fragen nicht viel Klarheit gewinnen. Weiß jemand, warum das passiert?

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

Zurück verfolgen

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 gibt standardmäßig bytes-Objekte für stdout- oder stderr-Streams zurück. Das heißt, Sie müssen auch bytes-Objekte in Operationen für diese Objekte verwenden. "Duration" in x verwendet str-Objekt. Verwenden Sie ein Byte-Literal (beachten Sie das Präfix b):

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

Die Alternative ist, subprocess.Popen() anzuweisen, die Daten in Unicode-Zeichenfolgen zu decodieren, indem das encoding-Argument auf einen geeigneten Codec gesetzt wird:

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

Wie der Fehler sagt, ist "Duration" eine Zeichenfolge. Das X ist dagegen ein byteähnliches Objekt, da results.stdout.readlines() die Zeilen in der Ausgabe als Bytecode und nicht als String liest.

Speichern Sie daher "Duration" in einer Variablen, beispielsweise "str_var", und kodieren Sie sie mit str_var.encode('utf-8') in ein Byte-Array-Objekt.

Siehe [this] [1].

[1]: Bester Weg, um Zeichenfolge in Python 3 in Byte zu konvertieren?

0
Harshith Thota