exe 文件未运行(cx_Freeze + PySide)
Posted
技术标签:
【中文标题】exe 文件未运行(cx_Freeze + PySide)【英文标题】:exe file not running (cx_Freeze + PySide) 【发布时间】:2013-03-22 18:32:01 【问题描述】:使用 cx_freeze 冻结我的 Python 程序后,我尝试运行创建的 exe 文件,但它没有运行。
PhoneBook.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 代码时,它会显示正确的结果。请帮帮我。
【问题讨论】:
检查它在哪里寻找PhoneBook.ui
- 你可能需要给它那个文件的位置。
我尝试过制作资源文件,但没有成功。因为我使用的是 Python 3.3,所以我不能使用 py2exe 或 pyinstaller。请帮忙。
尝试将Phonebook.ui
与可执行文件放在同一文件夹中,并获取代码以查找os.path.join(os.path.dirname(sys.executable), 'Phonebook.ui')
。
【参考方案1】:
从文档看来,您必须包含 atexit
cxfreeze yourapp.py --target-dir dist --base-name Win32GUI --include-modules atexit,PySide.QtNetwork --icon yourapptaskgroup.ico
该网站特别提到,如果您不包含 atextit ,安装程序将无法工作
“atexit”必须包含在--include-modules中,否则生成的exe会失败。
Link to the knowledge base article
【讨论】:
谢谢,我在 cx_Freeze 上打开了一个问题,以便在 PySide 中自动包含 atexit:bitbucket.org/anthony_tuininga/cx_freeze/issue/36/…【参考方案2】:另一个错误原因是 cx-freeze 使用了来自 PyQt 的一些 dll。
而且 pyside 和 pyqt 中的 dll 并不相同,所以如果您安装了 pyqt,我建议将 PyQt4 添加到排除项
excludes=['PyQt4', 'tcl', 'tk', 'ttk', 'tkinter', 'Tkconstants', 'Tkinter', "collections.sys", "collections._weakref"]
【讨论】:
以上是关于exe 文件未运行(cx_Freeze + PySide)的主要内容,如果未能解决你的问题,请参考以下文章
使用 cx_Freeze 执行的 Python 脚本,exe 啥也不做
使用 cx_Freeze - 如何在 .exe 中包含所有必要的文件?