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