如何在执行外部shell命令后执行一些python语句

如何在执行外部shell命令后执行一些python语句,python,python-3.x,django,Python,Python 3.x,Django,我正在开发一个Django应用程序,它使用FFMPEG。基本上,它接收用户上传的视频,并使用FFMPEG将其转码为240p、360p和480p。由于这是服务器端代码,许多用户可能会同时上载。同样在转码之后,记录被添加到数据库表中 out="media/uploads/"+folder #This is the upload path where folder is the name of the video BASE_DIR = os.path.dirname(os.pat

我正在开发一个Django应用程序,它使用FFMPEG。基本上,它接收用户上传的视频,并使用FFMPEG将其转码为240p、360p和480p。由于这是服务器端代码,许多用户可能会同时上载。同样在转码之后,记录被添加到数据库表中

out="media/uploads/"+folder #This is the upload path where folder is the name of the video

BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))

command = "ffmpeg -i '"+os.path.join(BASE_DIR,out)+"/"+fname+"' -s 426x240 '"+os.path.join(BASE_DIR,out)+"/240p.mp4'"
subprocess.call(command,shell=True)
convert = Convert.objects.get_or_create(vid=rec,name="240p.mp4",video=str(out+'/240p.mp4'))

command = "ffmpeg -i '"+os.path.join(BASE_DIR,out)+"/"+fname+"' -s 640x360 '"+os.path.join(BASE_DIR,out)+"/360p.mp4'"
subprocess.call(command,shell=True)
convert = Convert.objects.get_or_create(vid=rec,name="360p.mp4",video=str(out+'/360p.mp4'))

command = "ffmpeg -i '"+os.path.join(BASE_DIR,out)+"/"+fname+"' -s 854x480 '"+os.path.join(BASE_DIR,out)+"/480p.mp4'"
subprocess.call(command,shell=True)
convert = Convert.objects.get_or_create(vid=rec,name="480p.mp4",video=str(out+'/480p.mp4'))
由于此代码将在服务器上运行,因此多个用户可能会同时上载视频。我希望此代码在该场景中运行时不会出现任何问题。此外,数据库操作必须仅在执行FFMPEG命令后执行


必须对此代码进行哪些更改?

您可以使用
tempfile.TemporaryDirectory
创建一个临时文件夹,使文件不会相互冲突。另外-请不要在这里使用
shell=True
。任何控制
fname
的上传程序都可以使用此shell注入来利用此漏洞并访问您的服务器。您可以使用参数列表来调用它;如果你能用替换代码给出一个答案,我将不胜感激。没有你的团队,我真的很难提供帮助,因为有很多依赖关系;实际上,我向少数人征求了建议,他们建议,如果这是在AWS云上运行的,那么我们可以为ffmpeg+db更新设置类似AWS sqs work queue->lambda函数的东西;此外,运行ffmpeg和django可能会造成瓶颈,因为两者都受到cpu的限制;也可能影响//请求的并发性;+看看您是否也可以在这里利用asyncio;幸运的是,你可以使用
tempfile.TemporaryDirectory
创建一个临时文件夹,这样文件就不会相互冲突。另外-请不要在这里使用
shell=True
。任何控制
fname
的上传程序都可以使用此shell注入来利用此漏洞并访问您的服务器。您可以使用参数列表来调用它;如果你能用替换代码给出一个答案,我将不胜感激。没有你的团队,我真的很难提供帮助,因为有很多依赖关系;实际上,我向少数人征求了建议,他们建议,如果这是在AWS云上运行的,那么我们可以为ffmpeg+db更新设置类似AWS sqs work queue->lambda函数的东西;此外,运行ffmpeg和django可能会造成瓶颈,因为两者都受到cpu的限制;也可能影响//请求的并发性;+看看您是否也可以在这里利用asyncio;祝你好运