Как запустить асинхронную функцию синхронно в 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' никогда не является правильным ответом

Вернуться на верх