我试图让这段代码从任何提到我的 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
提交
取消