2015-09-16 5 views
1

Архитектура программы состоит из исполняемого файла PySide GUI с Py2exe. Кроме того, у него есть вторая консольная консоль python с Py2exe.Приложение, вызванное с подпроцессом из приложения PySide GUI (py2exe), перестало работать

GUI-приложение запускает консольное приложение с использованием именованной трубы, чтобы иметь возможность отправлять CTRL_C и записывать stdout/stderr. Это делается с использованием модуля pywin32.

Внутри консольного приложения несколько других приложений Windows выполняются в режиме блокировки с использованием модуля подпроцесса. Теперь консольное приложение получило дополнительный код для выполнения другой программы в неблокирующем режиме.

Если приложение GUI и приложение Console выполнены (перед сборкой в ​​приложение Py2exe) все работает так, как ожидалось и требуется. Если приложения создаются с помощью Py2exe, внешнее приложение Windows замерзает и появляется сообщение об ошибке Windows. (приложение перестало работать)

Если код выполнения внешнего приложения Windows изолирован и исполняемая сборка py2exe, все работает.

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

Надеюсь, кто-то может указать мне в правильном направлении.

Меня попросили дать минимальный пример. Проблема в том, что архитектура действительно не позволяет использовать минимальный рабочий пример. Я старался изо всех сил, и я надеюсь, что данный пример рисует более четкое изображение проблемы. Как объяснено путем тестирования проблема может быть уменьшена до py2exe. Как только приложение GUI «скомпилировано» для запуска неблокирующего приложения внутри консольного приложения работает, но новое приложение вызывает ошибку Windows.

Минимальный Пример:

Консоль приложения console.py:

import logging 
import subprocess 
from time import sleep 

def exec_program_nonblocking(args, cwd=None): 
    if cwd: 
     logging.debug("Change working directory to: %s", cwd) 

    subprocess.Popen(args, 
       cwd=cwd, 
       universal_newlines=True) 

def main(): 
    args = ["program.exe", "arg1", "arg2"] 
    exec_program_nonblocking(args) 
    while (True): 
     print "do something \n" 
     sleep(5) 

if __name__ == '__main__':  
    main() 

setup.py для консоли App:

from distutils.core import setup 
import py2exe 

setup(console=['console.py']) 

PySide графического интерфейса приложения gui_app.py:

from PySide.QtGui import QApplication 

def start_console_app(): 
    pass 
    # complex implementation of openening named pipe, 
    # handling callbacks, allowing to send CTRL_C to new process etc. 
    # Minimal example is not possible... 

app = QtGui.QApplication([]) 

button = QtGui.QPushButton('Start Console App') 
button.clicked.connect(start_console_app) 
button.show() 

app.exec_() 

setup.py для GUI Применение:

from distutils.core import setup 
import py2exe 

setup(
    options = { 
     'py2exe' : { 
      'packages' : 'encodings', 
      'unbuffered' : True 
      #dll_excludes.... 
     } 
    }, 
    zipfile = None, 

    windows = ['gui_app.py'] 
) 
+0

Пожалуйста, рассмотрите добавление [MCVE]. Я сомневаюсь, что у кого-нибудь появятся предложения, если вы не предоставите какой-либо код, демонстрирующий проблему (также укажите информацию о том, как вы используете py2exe). –

ответ

0

Для меня решение отправил here работал для меня. Как-то py2exe испортился с обработками, переданными от процесса отца, графическим интерфейсом, к процессу child-child. Это даже не происходит со всеми исполняемыми файлами, которые являются подпроцессами из консольного приложения.

Модуль подпроцесса предлагает параметр close_fds, чтобы предотвратить повреждение обработок childprocess от процесса отцов. Это не работало для моего приложения. Тем не менее, это должно быть связано с py2exe.

Дает флаг DETACHED_PROCESS параметру createflags открыта новая консоль и процесс успешно запущен!

Единственным недостатком является то, что stdout/stderr не может быть захвачен, насколько я знаю.

рабочий пример:

import subprocess 

DETACHED_PROCESS = 0x00000008 

subprocess.Popen(args, 
       cwd=cwd, 
       creationflags=DETACHED_PROCESS) 

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

  • Нет связанных вопросов^_^