2017-03-21 16 views
0

我正在向python中的函數發送一個文件,並試圖將結果保存到一個變量中,但我不斷收到該錯誤。Python + ffmpeg TypeError:並非在字符串格式化過程中轉換的所有參數

我看過其他答案,但似乎沒有任何合適的。任何幫助表示讚賞:

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

請包括完整的錯誤追溯。 – Mikael

回答

1

我不知道你想實現你的代碼,這部分的內容:

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

Python map function接受一個函數和一個可迭代和返回通過將函數應用於可迭代的每個元素獲得的列表[1]。在你的情況下,iterable是一個字符串,並且字符串的元素是它的字符,所以map(pipes.quote, sys.argv[1])的結果將是你的字符串中的字符列表,必要時引用。例如,如果sys.argv[1]爲10個字符長,map(pipes.quote, sys.argv[1])將是長名單10

我只能看到你的命令行字符串一個%s佔位符,所以除非sys.argv[1]恰好只包含一個字符,你會遇到'not all arguments converted ...'異常,因爲字符串中的%s佔位符的數量不同於您試圖放入字符串的值的數量。

正如我所看到的,最簡單的解決方法是刪除對tuplemap的調用,而只是使用pipes.quote(sys.argv[1])來代替。

[1]map()實際上可以採用多個迭代,但爲了簡單起見,我忽略了這一點。當給出兩個參數時,它的行爲如我所描述的那樣。

+0

謝謝!這有助於。我遇到的一個問題就是使用pipes.quote(sys.argv [1])是在文件的文件名中,它們在文件名中放置了一個「##」。劇本現在已經掛上了。我如何解決這個問題?這裏是我看到處理文件名時看到的一個例子:/Users/chrissmith/Downloads/TRAININGSKU_AbbySunderland\#\#157487.aif –

+0

@SonicMotion:你確定它是它抱怨的'#'字符嗎?你的文件名在5到7之間有兩個奇怪的Unicode字符。此外,「掛斷」的意思是什麼? –

+0

我不知道這是問題,我現在得到的錯誤是:OSError:[Errno 2]沒有這樣的文件或目錄 - 所以##是我的第一個想法。當我說「掛斷」時,我的意思是,我被困住了。 –

相關問題