exe-файл не запущен (cx_Freeze + PySide)

После замораживания моих программ Python с помощью cx_freeze я попытался запустить созданный exe-файл, но он не запускается.

Телефонная книга.py

import  sys
from PySide.QtCore import *
from PySide.QtGui import *
from PySide.QtUiTools import *

class PhoneBook:
  i=0;
  def __init__(self):
        loader = QUiLoader();       
        file = QFile("PhoneBook.ui");   
        file.open(QFile.ReadOnly);  
        self.ui = loader.load(file);    
        file.close();
        self.ui.setWindowIcon(QIcon('web.png'));
        self.ui.pushButton.clicked.connect(self.add);
        self.ui.pushButton_2.clicked.connect(self.load);

  def __del__ ( self ):
        self.ui = None;

  def add(self):
        loader1 = QUiLoader();      
        file1 = QFile("Add.ui");    
        file1.open(QFile.ReadOnly); 
        self.ui2 = loader1.load(file1); 
        file1.close();          
        self.ui2.show();
        self.ui2.pushButton.clicked.connect(self.get);


  def show(self):
        self.ui.show();

  def clear1(self):
        self.ui.lineEdit.clear();

  def get(self):

        name1 = self.ui2.lineEdit.text();
        name2 = self.ui2.lineEdit_2.text();

        f = open('data','a' );
        f.write(name1);
        f.write('#');
        f.write(name2);
        f.write('\n');
        f.close();
        self.load();
        self.ui2.close();

  def load(self):
        f = open('data', 'r');
        for i in range(0, 10):
            string = f.readline();
            l=len(string);
            print(string);
            print(l);
            for  c in range(0, l-1):
                if string[c]=="#":
                   break;
                print(c);       
                name1=string[0:c];
                name2=string[c+1:l-1]; 
                self.ui.tableWidget.setItem(i, 0, QTableWidgetItem(name1));
                self.ui.tableWidget.setItem(i, 1, QTableWidgetItem(name2));
                i =i+1;

  def sort(self):
        f=open('data', 'r');
        f.readlines().sort();

  if __name__ == '__main__':

        app = QApplication(sys.argv)
        app.setApplicationName('PhoneBook Application')

        w = PhoneBook();
        w.show();

        QObject.connect(app, SIGNAL('lastWindowClosed()'), app,SLOT('quit()'))

        sys.exit(app.exec_())

setup.py

import sys
from cx_Freeze import setup,Executable

includefiles = ['Add.ui', 'PhoneBook.ui', 'data', 'web.png']
includes = ["re"]
base = None
if sys.platform == "win32":
   base = "Win32GUI"
setup(name="PhoneBook", version="3.0",description="Test",options = {'build_exe':  {'include_files':includefiles, 'includes' : includes}

Это потому, что я использую QUILoader? Однако при непосредственном выполнении кода Python он показывает правильные результаты. Помогите пожалуйста мне.


person ganit44    schedule 22.03.2013    source источник
comment
Проверьте, где он ищет PhoneBook.ui — возможно, вам потребуется указать местоположение этого файла.   -  person Thomas K    schedule 23.03.2013
comment
Я попытался сделать это, создав файл ресурсов, но это было напрасно. Поскольку я использую Python 3.3, я не могу использовать py2exe или pyinstaller. Пожалуйста помоги.   -  person ganit44    schedule 23.03.2013
comment
Попробуйте поместить Phonebook.ui в ту же папку, что и исполняемый файл, и заставить код искать os.path.join(os.path.dirname(sys.executable), 'Phonebook.ui').   -  person Thomas K    schedule 23.03.2013


Ответы (2)


Из документов кажется, что вы должны включить atexit

cxfreeze yourapp.py --target-dir dist --base-name Win32GUI --include-modules atexit,PySide.QtNetwork --icon yourapptaskgroup.ico

На сайте особо упоминается, что если вы не включите atextit , программа установки не будет работать.

«atexit» должен быть включен в —include-modules, иначе сгенерированный exe не будет работать.

Ссылка на статью базы знаний

person Gagan    schedule 30.06.2013
comment
Спасибо, я открыл задачу на cx_Freeze для автоматического включения atexit в PySide: bitbucket.org/anthony_tuininga/cx_freeze/issue/36/ - person Thomas K; 02.07.2013

Другая причина ошибки заключалась в том, что cx-freeze использовал некоторые библиотеки DLL из PyQt.

И библиотеки DLL не совпадают в pyside и pyqt, поэтому, если у вас установлен pyqt, я бы предложил добавить PyQt4 в исключения

excludes=['PyQt4', 'tcl', 'tk', 'ttk', 'tkinter', 'Tkconstants', 'Tkinter', "collections.sys", "collections._weakref"]
person kaosar    schedule 02.04.2017