2015-09-10 6 views
0

Я пытаюсь открыть скрипт python из основной программы python в отдельном процессе.Откройте еще один скрипт Python из другого процесса Python

Теперь давайте просто скажем, что «основная программа» - это программа GUI PyQt4, а «скрипт» - это сценарий (в отдельном файле). Я пытаюсь запустить из своей основной программы.

Почему?

  1. Так скрипт продолжает работать после того, как основная программа закрыта

  2. Так что, когда сценарий побежал моя основная программа не замерзает во время ожидания сценария с бесконечным циклом до конца.

Я знаю, что subproces.Popen(), subprocess.call() и os.system() могут открыть файл с помощью командной строки, но когда они открывают скрипт с бесконечным циклом основных программных зависаний и сбои.

Я также знаю, что я мог бы использовать QtCore.QCoreApplication.processEvents(), чтобы поддерживать основную программу, но это не работает в моем случае.

Итак, я решил, что наилучшим решением для правильной работы скрипта и главной программы является наличие отдельных процессов.

Как открыть этот файл script.py в отдельном процессе или таким образом, чтобы не замерзать мою программу.

+0

Не совсем другой процесс, но вы можете использовать потоки, чтобы иметь два скрипта python, выполняемых в то же самое время. – RandomHash

ответ

1

Calling an external command in Python, вероятно, то, что вы ищете. Автор прекрасно описывает, как запускать другой скрипт python, который продолжает работать, когда ваша основная программа закрыта.

+0

Используя это (Popen, popen, call, os.system), всегда зависает программа. Прямо сейчас я использую самый глупый трюк: я использую Popen для запуска скрипта .vbs, который открывает .bat без консоли, которая запускает сценарий, который мне нужен. Просто глупо. –

0

Не запускайте скрипты python в качестве подпроцессов, импортируйте соответствующие модули и вызовите нужные функции. Если вам необходимо запустить код Python в отдельном процессе, можно использовать multiprocessing:

multiprocessing.Process(target=infinite_loop, args=['arg 1', 2]).start() 

Связанный: Call python script with input with in a python script using subprocess.

Чтобы избежать «замораживания» вашего графического интерфейса, не вызывайте функции, которые долго сохраняются в вашем потоке графического интерфейса. Используйте либо потоки, либо асинхронные. API (здесь tkinter code example that uses createfilehandler() and .after() calls, to read output from a subprocess without blocking the GUI).

Popen() только начинает дочерний процесс и не ждет его выхода. Если Popen() «замораживает» вашу программу, то что-то еще сломано. Вот code example that starts/stops a tkinter progressbar on start/end of a subprocess.

Qt имеет свой собственный API: QThread, QProcess, сигналы, которые можно использовать для запуска подпроцесса. Связано: How to do stuff during and after a child process.

Смежные вопросы