使用 runcmd 提取推文信息时出现问题

我试图让这段代码从任何提到我的 Twitter 句柄的推文中提取媒体,通过子进程模块使用 ffmpeg 对其进行转换,然后将转换后的媒体作为回复发送回该人。


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 -i,output.jpg那么我该如何进行tweet_media无错误的转换呢?


汪汪一只猫
浏览 128回答 1
1回答

慕妹3242003

如果您想保持通话原样,您需要这样的东西: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')结果为cmdequaling ('ffmpeg', '-i', tweet_media, 'output.jpg')。Popen将表示要运行的命令的字符串列表作为第一个参数。因此,首先*cmd将元组展开为元素,然后[*cmd]将元素放入列表中,这样我们就得到了所需的调用['ffmpeg', '-i', tweet_media, 'output.jpg']。注意:指定'ffmpeg -i'为列表的第一个元素会Popen搜索名为 的可执行文件ffmpeg<SPACE>-i,该可执行文件很可能不存在,因此您应该使用'ffmpeg', '-i'它。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python