Собственно есть 2 пути. Показываю для linux.
Первый ждет завершения вызываемого кода (текущий поток останавливается), а второй просто открывает его в параллельном процессе (текущий поток продолжает работать и появляется новый процесс в задачах).
Первый использует os
import os
os.system('command')
где command - команда операционной системы… Так можно не только запустить что-то на исполнение, но и выполнить, например, копирование, создание каталога и т.д. и т.п. — т.е. любую команду, которую вы введете в терминале.
Второй — через subprocess. Показываю тоже два случая:
import subprocess
subprocess.Popen(['pcmanfm','/home/alex/.shutter']) # запуск с аргументом
path = '/home/alex/РабочийСтол/QML на PyQt5.ctb' # имя файла
subprocess.Popen(['xdg-open']+[path]) # открытие файла в ассоциированной программе
Первый случай - когда просто нужно запустить процесс с параметром, а второй - если нужно открыть файл неизвестной природы в его программе, то используется xdg-open (например: xdg-open <полный путь>).
Как-то так… Для win - смотри справку по этим методам. Есть и еще способы, но эти самые понятные.