Как запустить асинхронную функцию синхронно в python
Я изучаю Django и столкнулся с этой проблемой.
В общем, я написал две функции run, и вторая функция run использует выход первой в качестве входа. Теперь кажется, что функция run работает асинхронно, поэтому прежде чем первая функция run полностью выполнится и выдаст свой вывод, вторая функция run начинает выполняться, и поскольку ей нужен вывод первой функции run в качестве входа, она не выдает никакого вывода. Поэтому я хочу, чтобы функция запуска выполнялась синхронно.
Вот фрагмент кода
run(["gnome-terminal", "--", "sh", "-c", f"ffmpeg -i {video_name}_audio_stripped.mp4 -i {audio_name} -c:v copy -c:a aac {final_tutorial}"], cwd="media/")
for i in range(1000000000):
continue
run(["gnome-terminal", "--", "sh", "-c", f"ffmpeg -i {final_tutorial} -vcodec libx265 -crf 28 reduce_{final_tutorial}"], cwd="media/")
В приведенном выше коде я использовал цикл for, и он работает, но я не думаю, что это правильный способ. Может ли кто-нибудь подсказать мне правильный способ?
Вот мой файл views.py.
def video(request):
if request.method == 'POST':
uploaded_video_file = request.FILES["video"]
video_file_name = uploaded_video_file.name
fs = FileSystemStorage()
video_name = fs.save(video_file_name, uploaded_video_file)
run(["gnome-terminal", "--", "sh", "-c", f"ffmpeg -i {video_name} -c:v copy -an {video_name}_audio_stripped.mp4"], cwd="media/")
final_tutorial=video_name+"_spoken_tutorial.mp4"
run(["gnome-terminal", "--", "sh", "-c", f"ffmpeg -i {video_name}_audio_stripped.mp4 -i {audio_name} -c:v copy -c:a aac {final_tutorial}"], cwd="media/")
'''async def async_func():
run(["gnome-terminal", "--", "sh", "-c", f"ffmpeg -i {final_tutorial} -vcodec libx265 -crf 28 reduce_{final_tutorial}"], cwd="media/")
loop = asyncio.get_event_loop()
coroutine = async_func()
loop.run_until_complete(coroutine)'''
for i in range(1000000000):
continue
run(["gnome-terminal", "--", "sh", "-c", f"ffmpeg -i {final_tutorial} -vcodec libx265 -crf 28 reduce_{final_tutorial}"], cwd="media/")
context = {'generated_tutorial': "reduce_"+final_tutorial}
return render(request, 'UploadVideo.html', context)
return render(request, 'DownloadAudio.html')
Догадываюсь, что "run" - это subprocess.run. Тогда это функция. Попробуйте subprocess.call. Цикл 'wait for loop' никогда не является правильным ответом