當您使用子進程時,您的命令必須是一個與您在命令行中鍵入的內容完全相同的字符串(並且您設置了shell = True),或者每個命令都是列表中的項目並且您將默認shell = False)。無論哪種情況,您都必須處理字符串的可變部分。例如,操作系統不知道「%03d」是什麼,你必須填寫它。
我不能確切地告訴你的問題到底是什麼參數,但讓我們假設你想轉換幀3 ,它看起來像這樣一個字符串:
my_frame = 3
subprocess.call(
'ffmpeg -r 10 -i frame%03d.png -r ntsc movie%03d.mpg' % (my_frame, my_frame),
shell=True)
它在這個例子中有點微妙,但這是有風險的。假設這些東西位於名稱中有空格的目錄中(例如./我的電影/恐怖電影)。殼會被這些空間所困惑。
所以,你可以把它變成一個列表,並避免該問題
my_frame = 3
subprocess.call(['ffmpeg', '-r', '10', '-i', 'frame%03d.png' % my_frame,
['-r', 'ntsc', 'movie%03d.mpg' % my_frame])
更打字,但更安全。
運行命令,但每個參數列表中分裂出來。如果你把它作爲一個單一的字符串,那麼你將不得不指定'shell = True',你可能不想這麼做。所以,假設你的命令是作爲變量'cmd'構建的,運行'subprocess.call(cmd.split())'並等待魔術。 – sberry 2014-09-21 02:55:42
什麼是錯誤? shell = True可以解決它。 – tdelaney 2014-09-21 02:58:01
謝謝,是的,shell = True可以讓我將這些命令作爲一個大字符串來運行,但是我也很好奇如果使用變量名替換'movie.mpg',它的語法也是如此。 – user3295674 2014-09-21 03:57:56