Есть косвенное решение - разрешить в браузере сохранять загрузки автоматически без запроса места сохранения (на сколько я знаю это поведение по умолчанию) и из скрипта сформировать файл через File,
Blob или MediaSource, создать для него ссылку с помощью
createObjectURL (на сколько я помню это будет
data uri строчка) и кликнуть по ней.
var file=new Blob([JSON.stringify(obj, null, 2)], { type: "application/json"});
var url=URL.createObjectURL(file);
var a = document.getElementById("a"); // где то на странице невидимая ссылка
a.href = URL.createObjectURL(file);
a.download = 'myfilename.json';
Как вариант строчку сделать самому и отправить его прямо в location, что то типа location.href='data:text/plain;charset=utf-8,test').
Твое python приложение пусть ожидает файл в каталоге для загрузок, указанном в настройках браузера. Будь готов, что браузер добавить ' (xxx)' к имени файла, если такой же там уже есть.
Я примерно таким образом добавленным через консоль (или расширением типа greasemonkey) скриптом кликал и собирал данные в веб приложении, после отправлял их на сохранение в виде csv-шника, а затем собрал кучу сохраненных файлов уже десктопным приложением.