我試圖讓這段代碼從任何提到我的 Twitter 句柄的推文中提取媒體,通過子進程模塊使用 ffmpeg 對其進行轉換,然后將轉換后的媒體作為回復發送回該人。import tweepyfrom tweepy import Streamfrom tweepy.streaming import StreamListenerfrom datetime import datetimeimport timeimport subprocessstdout = subprocess.PIPEdef runcmd(cmd): x = subprocess.Popen(cmd, stdout=subprocess.PIPE) return x.communicate(stdout)import jsonimport randomclass StdOutListener(StreamListener): def on_data(self, data): clean_data = json.loads(data) tweetId = clean_data['id'] tweet_name = clean_data['user']['screen_name'] tweet_media = clean_data['entities']['media'][0]['media_url'] print(tweet_media) tweet_photo = runcmd('ffmpeg -i', tweet_media, 'output.jpg') tweet = 'Here ya go' now = datetime.now() dt_string = now.strftime("%d/%m/%Y %H:%M:%S") print(' Reply sent to @'+tweet_name, 'on', dt_string, '\n' ' Message:', tweet, '\n') respondToTweet(tweet_media, tweet, tweetId)但我總是會遇到這個錯誤:Exception has occurred: TypeErrorruncmd() takes 1 positional argument but 3 were given tweet_photo = runcmd('ffmpeg -i', tweet_media, 'output.jpg')顯然,我不能介于tweet_media兩者之間ffmpeg -i,output.jpg那么我該如何進行tweet_media無錯誤的轉換呢?
1 回答

慕妹3242003
TA貢獻1824條經驗 獲得超6個贊
如果您想保持通話原樣,您需要這樣的東西:
def?runcmd(*cmd): ????x?=?subprocess.Popen([*cmd],?stdout=subprocess.PIPE)? ???????return?x.communicate(stdout)
進一步說明:Popen()
將命令作為單詞列表運行。因此,有兩個 Python 特性需要使用。
def runcmd(*cmd):
這表示該函數接受任意參數列表,并將它們存儲為cmd
元組,因此調用runcmd('ffmpeg', '-i', tweet_media, 'output.jpg')
結果為cmd
equaling?('ffmpeg', '-i', tweet_media, 'output.jpg')
。Popen
將表示要運行的命令的字符串列表作為第一個參數。因此,首先*cmd
將元組展開為元素,然后[*cmd]
將元素放入列表中,這樣我們就得到了所需的調用['ffmpeg', '-i', tweet_media, 'output.jpg']
。
注意:指定'ffmpeg -i'
為列表的第一個元素會Popen
搜索名為 的可執行文件ffmpeg<SPACE>-i
,該可執行文件很可能不存在,因此您應該使用'ffmpeg', '-i'
它。
添加回答
舉報
0/150
提交
取消