0

我正在尝试获取此代码以从任何提及我的 Twitter 句柄的推文中提取媒体,使用 ffmpeg 通过 subprocess 模块对其进行转换,然后将转换后的媒体作为回复发送回此人。

import tweepy
from tweepy import Stream
from tweepy.streaming import StreamListener
from datetime import datetime
import time
import subprocess

stdout = subprocess.PIPE
def runcmd(cmd):
    x = subprocess.Popen(cmd, stdout=subprocess.PIPE)
    return x.communicate(stdout)

import json
import random

class 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: TypeError
runcmd() takes 1 positional argument but 3 were given
   tweet_photo = runcmd('ffmpeg -i', tweet_media, 'output.jpg')

很明显,我不能tweet_media介于两者之间ffmpeg -ioutput.jpg那么我将如何在tweet_media没有错误的情况下进行转换?

4

1 回答 1

1

基于这个答案,如果你想保持通话不变,你需要这样的东西:

def runcmd(*cmd):
    x = subprocess.Popen([*cmd], stdout=subprocess.PIPE)
    return x.communicate(stdout)

另请参阅Arbitrary Argument Lists的官方文档

进一步说明:Popen()将命令作为单词列表运行。因此,有两个 Python 特性需要使用。

  1. def runcmd(*cmd):这表示该函数采用任意参数列表,并将它们cmd作为元组存储,因此调用runcmd('ffmpeg', '-i', tweet_media, 'output.jpg')结果为cmdequaling ('ffmpeg', '-i', tweet_media, 'output.jpg')

  2. Popen将表示要运行的命令的字符串列表作为第一个参数。因此,首先*cmd将元组解包到元素中,然后[*cmd]将元素放入列表中,这样我们就得到了所需的调用['ffmpeg', '-i', tweet_media, 'output.jpg']

注意:指定'ffmpeg -i'为列表的第一个元素会Popen搜索名为 的可执行文件ffmpeg<SPACE>-i,它很可能不存在,因此您应该使用它'ffmpeg', '-i'

于 2020-08-27T08:20:41.827 回答