Запускать внешнюю программу одновременно в Python - PullRequest
1 голос
/ 14 февраля 2012

Мне интересно, как вызывать внешнюю программу таким образом, чтобы пользователь мог продолжать взаимодействовать с пользовательским интерфейсом моей программы (созданным с использованием tkinter, если это важно), пока работает программа Python. Программа ожидает, когда пользователь выберет файлы для копирования, поэтому он все еще должен иметь возможность выбирать и копировать файлы во время работы внешней программы. Внешняя программа - Adobe Flash Player.

Возможно, некоторая трудность связана с тем, что у меня есть класс "рабочий" с резьбой? Он обновляет индикатор выполнения во время копирования. Я хочу, чтобы индикаторы выполнения обновлялись, даже если Flash Player открыт.

  1. Я попробовал модуль subprocess. Программа запускается, однако не позволяет пользователю использовать пользовательский интерфейс до тех пор, пока Flash Player не будет закрыт. Кроме того, копирование по-прежнему происходит в фоновом режиме, просто индикатор выполнения не обновляется, пока не закроется Flash Player.

    def run_clip():
        flash_filepath = "C:\\path\\to\\file.exe"
    
        # halts UI until flash player is closed...
        subprocess.call([flash_filepath])              
    
  2. Далее я попытался использовать модуль concurrent.futures (я все равно использовал Python 3). Поскольку я до сих пор использую subprocess для вызова приложения, неудивительно, что этот код ведет себя точно так же, как в приведенном выше примере.

    def run_clip():
        with futures.ProcessPoolExecutor() as executor:
        flash_filepath = "C:\\path\\to\\file.exe"
        executor.submit(subprocess.call(animate_filepath))
    

Проблема заключается в использовании subprocess? Если так, есть ли лучший способ вызвать внешнюю программу? Заранее спасибо.

1 Ответ

8 голосов
/ 14 февраля 2012

Вам просто нужно продолжать читать о модуле подпроцесс , в частности о Popen.

Для одновременного запуска фонового процесса необходимо использовать subprocess.Popen:

import subprocess

child = subprocess.Popen([flash_filepath])
# At this point, the child process runs concurrently with the current process

# Do other stuff

# And later on, when you need the subprocess to finish or whatever
result = child.wait()

Вы также можете взаимодействовать с входным и выходным потоками подпроцесса через члены Popen -объекта (в данном случае child).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...