Nag*_*ani 6 python pyinstaller pyqt4 qthread
运行bat文件的程序,其中包含使用Qthread运行可执行文件(longTask)的指令,但是当我使用Pyinstaller通过以下命令创建可执行文件时,该程序无法按预期工作。我给“ --windowed”提供了标准I / O的控制台窗口
pyinstaller --onefile --windowed main.py
但是有趣的是,当我删除--windowed参数时,它可以按预期工作
pyinstaller --onefile main.py
Run Code Online (Sandbox Code Playgroud)
这是代码:
from PyQt4.Qt import *
import subprocess
def callSubprocess():
page = QWizardPage()
page.setTitle("Run myLongTask")
runButton = QPushButton("Run")
progressBar = QProgressBar()
procLabel = QLabel()
procLabel1 = QLabel()
progressBar.setRange(0, 1)
layout = QGridLayout()
layout.addWidget(runButton, 0, 0)
layout.addWidget(progressBar, 0, 1)
layout.addWidget(procLabel)
layout.addWidget(procLabel1)
# Calls thread class
myLongTask = TaskThread()
runButton.clicked.connect(lambda: OnStart(myLongTask, progressBar, procLabel1))
myLongTask.taskFinished.connect(lambda: onFinished(progressBar, procLabel))
page.setLayout(layout)
return page
def OnStart(myLongTask, progressBar, procLabel1):
progressBar.setRange(0, 0)
myLongTask.start()
# I am waiting until my subprocess completes
while not myLongTask.isFinished():
QCoreApplication.processEvents()
procLabel1.setText("Hello This is main")
def onFinished(progressBar, procLabel):
# Stop the pulsation
progressBar.setRange(0, 1)
procLabel.setText("longTask finished")
class TaskThread(QThread):
taskFinished = pyqtSignal()
def __init__(self):
QThread.__init__(self)
def run(self):
proc = subprocess.Popen(r'C:\Users\Desktop\runInf.bat', bufsize=0, shell=True, stdout=subprocess.PIPE)
proc.wait()
self.taskFinished.emit()
def __del__(self):
self.wait()
if __name__ == '__main__':
import sys
app = QApplication(sys.argv)
wizard = QWizard()
wizard.addPage(callSubprocess())
wizard.setWindowTitle("Example Application")
wizard.show()
sys.exit(wizard.exec_())
Run Code Online (Sandbox Code Playgroud)
当在Pycharm中执行上述代码时,它将按预期工作。但是,当使用PyInstaller构建时,主线程不会等到子进程完成。
任何想法如何创建线程可以按预期工作的可执行文件。提前致谢
我刚刚解决了这个问题。我的发现如下。
罪魁祸首是子进程。因此,我用一些文件处理替换了子进程(假设打开文件 10000 次并写入一些内容),它按预期工作,这意味着主线程会等待子进程完成。
所以Pyinstaller 确实可以与线程一起正常工作
我添加了更多参数
proc = subprocess.Popen(os.getcwd() + r'\runInf.bat',
shell=True,
stdout=subprocess.PIPE,
stderr=subprocess.STDOUT,
stdin=subprocess.PIPE,
cwd=os.getcwd(),
env=os.environ)
proc.stdin.close()
Run Code Online (Sandbox Code Playgroud)
此更改使子进程运行,主线程也等待其完成
| 归档时间: |
|
| 查看次数: |
1098 次 |
| 最近记录: |