2017-03-21 2 views
0

Ich sende eine Datei an eine Funktion in Python und versuche, die Ergebnisse in eine Variable zu speichern, aber ich bekomme diesen Fehler immer wieder.Python + ffmpeg TypeError: nicht alle Argumente während der Formatierung von Zeichenfolgen konvertiert

Ich habe über die anderen Antworten geschaut, aber nichts scheint zu passen. Jede Hilfe ist willkommen:

def ffmpegLUFS(fileName): 
    subprocess.Popen("ffmpeg -i %s -filter_complex ebur128 -f null - 2>&1 | grep -n '.*' | grep -A 5 'size' | grep 'I:' | cut -d ':' -f3-" % tuple(map(pipes.quote, sys.argv[1])),stdout=subprocess.PIPE,shell=True).communicate()[0] 
    return 
Traceback (most recent call last): 
    File "/Volumes/videos/videos/DROP_BIN/CHRIS/POD_Workflow_Files/WebContent_Audio.py", line 30, in <module> 
    sourceLUFS = ffmpegLUFS(sys.argv[1]) 
    File "/Volumes/videos/videos/DROP_BIN/CHRIS/POD_Workflow_Files/WebContent_Audio.py", line 18, in ffmpegLUFS 
    subprocess.Popen("ffmpeg -i %s -filter_complex ebur128 -f null - 2>&1 | grep -n '.*' | grep -A 5 'size' | grep 'I:' | cut -d ':' -f3-" % tuple(map(pipes.quote, fileName)),stdout=subprocess.PIPE,shell=True).communicate()[0] 
TypeError: not all arguments converted during string formatting 
+0

Bitte schließen Sie die vollständige Fehlerrückverfolgung ein. – Mikael

Antwort

1

Ich bin nicht sicher, was Sie versuchen, mit diesem Teil des Codes zu erreichen:

tuple(map(pipes.quote, sys.argv[1])) 

Die Python map function nimmt eine Funktion und ein iterable und gibt eine Liste zurück, die durch Anwenden der Funktion auf jedes Element des iterierbaren [1] erhalten wurde. In Ihrem Fall ist das iterable ein String und die Elemente des Strings sind seine Zeichen. Das Ergebnis von map(pipes.quote, sys.argv[1]) ist also eine Liste von Zeichen aus Ihrem String, die bei Bedarf zitiert werden. Zum Beispiel, wenn sys.argv[1] 10 Zeichen lang ist, wird map(pipes.quote, sys.argv[1]) eine Liste der Länge 10.

ich nur einen %s Platzhalter in Ihrer Befehlszeilen-Zeichenfolge sehen konnte, so dass, wenn sys.argv[1] nur ein Zeichen enthalten passiert, werden Sie begegnen die Ausnahme 'nicht alle Argumente konvertiert ...', da die Anzahl der %s Platzhalter in der Zeichenfolge von der Anzahl der Werte abweicht, die Sie in die Zeichenfolge eingeben möchten.

Wie ich es sehe, ist die einfachste Lösung, die Aufrufe zu tuple und map zu entfernen und stattdessen pipes.quote(sys.argv[1]) stattdessen zu verwenden.

[1]map() kann tatsächlich mehrere iterable dauern, aber aus Gründen der Einfachheit ignoriere ich dies. Wenn es zwei Argumente gibt, verhält es sich so, wie ich es beschrieben habe.

+0

Danke! das hilft. Ein Problem, das ich gerade mit der Verwendung von pipes.quote (sys.argv [1]) habe, ist der Dateiname der Dateien, sie haben ein "##" in den Dateinamen platziert. Das Skript hängt jetzt damit auf. Wie repariere ich das? Hier ist ein Beispiel für das, was ich beim Verarbeiten des Dateinamens sehe: /Users/chrissmith/Downloads/TRAININGSKU_AbbySunderland\#\#157487.aif –

+0

@SonicMotion: Sind Sie sicher, dass es sich um die '#' Zeichen handelt, über die es sich beschwert? Dein Dateiname hat zwei ungerade Unicode-Zeichen zwischen den 5 und den ersten 7. Außerdem, was genau meinst du mit "aufgelegt"? –

+0

Ich bin nicht sicher, dass das das Problem ist, der Fehler, den ich jetzt bekomme, ist: OSError: [Errno 2] Keine solche Datei oder Verzeichnis - also war das ## mein erster Gedanke. Wenn ich "Aufgelegt" sage, meinte ich, ich wäre ratlos. –

Verwandte Themen