Pyinstaller: ImportError: cannot import name QtGui

2019-02-10 14:30发布

问题:

Using the latest pyinstaller on Windows 7 to make a standalone exe (-F), when running the exe:

ImportError: cannot import name QtGui

In the pyinstaller hooks directory there is special handling for PyQt4 though not PySide.

Hoping for a workaround for this or something to try.

Environment
Windows 7 64-bit
Python 2.7 32-bit
PYTHONHOME=c:\python27
PYTHONPATH=c:\python27\lib
PYTHONLIB=c:\python27\libs\python27.lib;c:\python27\lib\site-packages

Steps
1. Add PySide from http://releases.qt-project.org/pyside/1.1.1/PySide-1.1.1qt474.win32-py2.7.exe
2. Unzip https://github.com/pyinstaller/pyinstaller/zipball/develop to c:\pyinstaller1.5.1
3. Run the commands below against a .py file containing simply:

from PySide import QtGui

[...or QtCore or or.]

Run

c:\pyinstaller1.5.1>pyinstaller.py -F import_test.py
108 INFO: wrote c:\pyinstaller1.5.1\import_test.spec
171 INFO: Testing for ability to set icons, version resources...
296 INFO: ... resource update available
312 INFO: UPX is not available.
4321 INFO: checking Analysis
4382 INFO: checking PYZ
4430 INFO: checking PKG
4446 INFO: building because c:\pyinstaller1.5.1\build\pyi.win32\import_test\import_test.exe.manifest changed
4446 INFO: building PKG out00-PKG.pkg
16782 INFO: checking EXE
16782 INFO: rebuilding out00-EXE.toc because pkg is more recent
16782 INFO: building EXE from out00-EXE.toc
16799 INFO: Appending archive to EXE c:\pyinstaller1.5.1\dist\import_test.exe

c:\pyinstaller1.5.1>dist\import_test.exe
Traceback (most recent call last):
  File "<string>", line 23, in <module>
ImportError: cannot import name QtGui

Note

At the end of the PySide install (as admin), this message:
    close failed in file object destructor:
    sys.excepthook is missing
    lost sys.stderr
If that is about post install it can be handled manually:
    c:>python.exe c:\Python27\Scripts\pyside_postinstall.py -install
    Generating file C:\python27\qt.conf...
    PySide installed in c:/python27/Lib/site-packages/PySide...
    The PySide extensions were successfully installed.

回答1:

Workaround. This worked:

# Various imports, whatever, using normal sys.path, for example:
import os, sys, re, time, random
import subprocess, psutil

# Save sys.path
sys_path_saved = sys.path

# Limit sys.path for PySide import
sys.path = ['c:\\python27\\lib\\site-packages']

# PySide imports with limited sys.path
from PySide        import QtGui, QtCore
from PySide.QtGui  import QApplication, QLineEdit
from PySide.QtCore import QSettings, Qt

# Reset sys.path to original
sys.path = sys_path_saved

# Remainder of code...

Pyinstaller 1.5.1 should do a fine job of locating dependencies, and often does. However, all of many many attempts to use its pathex or hiddenimports in .spec failed. Modifying my environment variables also failed. Extracting various module files manually from from .egg sometimes worked.

However for PySide imports, the sys.path temporary limitation above was the workaround that worked.

Update: Unfortunately the exe only works on a machine with Python/Pyside installed, doesn't work on XP without Python.