这是我的代码
import sys
from PySide.QtCore import *
from PySide.QtGui import *
from PySide.QtWebKit import *
from encodings import *
from codecs import *
class BrowserWindow( QWidget ):
def __init__( self, parent=None ):
QWidget.__init__( self, parent )
self.Setup()
self.SetupEvent()
def Setup( self ):
self.setWindowTitle( u"Truease Speedy Browser" )
self.addr_input = QLineEdit()
self.addr_go = QPushButton( "GO" )
self.addr_bar = QHBoxLayout()
self.addr_bar.addWidget( self.addr_input )
self.addr_bar.addWidget( self.addr_go )
for attr in [
QWebSettings.AutoLoadImages,
QWebSettings.JavascriptEnabled,
QWebSettings.JavaEnabled,
QWebSettings.PluginsEnabled,
QWebSettings.JavascriptCanOpenWindows,
QWebSettings.JavascriptCanAccessClipboard,
QWebSettings.DeveloperExtrasEnabled,
QWebSettings.SpatialNavigationEnabled,
QWebSettings.OfflineStorageDatabaseEnabled,
QWebSettings.OfflineWebApplicationCacheEnabled,
QWebSettings.LocalStorageEnabled,
QWebSettings.LocalStorageDatabaseEnabled,
QWebSettings.LocalContentCanAccessRemoteUrls,
QWebSettings.LocalContentCanAccessFileUrls,
]:
QWebSettings.globalSettings().setAttribute( attr, True )
self.web_view = QWebView()
self.web_view.load( "http://www.baidu.com" )
layout = QVBoxLayout()
layout.addLayout( self.addr_bar )
layout.addWidget( self.web_view )
self.setLayout( layout )
def SetupEvent( self ):
self.connect(
self.addr_input,
SIGNAL("editingFinished()"),
self,
SLOT("Load()"),
)
self.connect(
self.addr_go,
SIGNAL("pressed()"),
self,
SLOT("Load()")
)
self.connect(
self.web_view,
SIGNAL("urlChanged(const QUrl&)"),
self,
SLOT("SetURL()"),
)
def Load( self, *args, **kwargs ):
url = self.GetCleanedURL()
if url != self.CurrentURL():
self.web_view.load( url )
def SetURL( self, *args, **kwargs ):
self.addr_input.setText( self.CurrentURL() )
def GetCleanedURL( self ):
url = self.addr_input.text().strip()
if not url.startswith("http"):
url = "http://" + url
return url
def CurrentURL( self ):
url = self.web_view.url().toString()
return url
def Main():
app = QApplication( sys.argv )
widget = BrowserWindow()
widget.show()
return app.exec_()
if __name__ == '__main__':
sys.exit( Main() )
我使用python browser.py
时效果很好。但在与pyinstaller -w browser.py
打包后出错。
这是pyinstaller输出:
E:\true\wuk\app2>pyinstaller -w b.py
16 INFO: wrote E:\true\wuk\app2\b.spec
16 INFO: Testing for ability to set icons, version resources...
32 INFO: ... resource update available
32 INFO: UPX is not available.
46 INFO: Processing hook hook-os
141 INFO: Processing hook hook-time
157 INFO: Processing hook hook-cPickle
218 INFO: Processing hook hook-_sre
312 INFO: Processing hook hook-cStringIO
407 INFO: Processing hook hook-encodings
421 INFO: Processing hook hook-codecs
750 INFO: Processing hook hook-httplib
750 INFO: Processing hook hook-email
843 INFO: Processing hook hook-email.message
1046 WARNING: library python%s%s required via ctypes not found
1171 INFO: Extending PYTHONPATH with E:\true\wuk\app2
1171 INFO: checking Analysis
1171 INFO: building because b.py changed
1171 INFO: running Analysis out00-Analysis.toc
1171 INFO: Adding Microsoft.VC90.CRT to dependent assemblies of final executable
1171 INFO: Searching for assembly x86_Microsoft.VC90.CRT_1fc8b3b9a1e18e3b_9.0.21022.8_x-ww ...
1171 INFO: Found manifest C:\WINDOWS\WinSxS\Manifests\x86_Microsoft.VC90.CRT_1fc8b3b9a1e18e3b_9.0.21022.8_x-ww_d08d0375.manifest
1187 INFO: Searching for file msvcr90.dll
1187 INFO: Found file C:\WINDOWS\WinSxS\x86_Microsoft.VC90.CRT_1fc8b3b9a1e18e3b_9.0.21022.8_x-ww_d08d0375\msvcr90.dll
1187 INFO: Searching for file msvcp90.dll
1187 INFO: Found file C:\WINDOWS\WinSxS\x86_Microsoft.VC90.CRT_1fc8b3b9a1e18e3b_9.0.21022.8_x-ww_d08d0375\msvcp90.dll
1187 INFO: Searching for file msvcm90.dll
1187 INFO: Found file C:\WINDOWS\WinSxS\x86_Microsoft.VC90.CRT_1fc8b3b9a1e18e3b_9.0.21022.8_x-ww_d08d0375\msvcm90.dll
1266 INFO: Analyzing D:\Applications\Python\lib\site-packages\pyinstaller-2.1-py2.7.egg\PyInstaller\loader\_pyi_bootstrap.py
1266 INFO: Processing hook hook-os
1282 INFO: Processing hook hook-site
1296 INFO: Processing hook hook-encodings
1391 INFO: Processing hook hook-time
1407 INFO: Processing hook hook-cPickle
1468 INFO: Processing hook hook-_sre
1578 INFO: Processing hook hook-cStringIO
1671 INFO: Processing hook hook-codecs
2016 INFO: Processing hook hook-httplib
2016 INFO: Processing hook hook-email
2109 INFO: Processing hook hook-email.message
2312 WARNING: library python%s%s required via ctypes not found
2468 INFO: Processing hook hook-pydoc
2516 INFO: Analyzing D:\Applications\Python\lib\site-packages\pyinstaller-2.1-py2.7.egg\PyInstaller\loader\pyi_importers.py
2609 INFO: Analyzing D:\Applications\Python\lib\site-packages\pyinstaller-2.1-py2.7.egg\PyInstaller\loader\pyi_archive.py
2687 INFO: Analyzing D:\Applications\Python\lib\site-packages\pyinstaller-2.1-py2.7.egg\PyInstaller\loader\pyi_carchive.py
2782 INFO: Analyzing D:\Applications\Python\lib\site-packages\pyinstaller-2.1-py2.7.egg\PyInstaller\loader\pyi_os_path.py
2782 INFO: Analyzing b.py
2796 INFO: Processing hook hook-PySide
2875 INFO: Hidden import 'codecs' has been found otherwise
2875 INFO: Hidden import 'encodings' has been found otherwise
2875 INFO: Looking for run-time hooks
7766 INFO: Using Python library C:\WINDOWS\system32\python27.dll
7796 INFO: E:\true\wuk\app2\build\b\out00-Analysis.toc no change!
7796 INFO: checking PYZ
7812 INFO: checking PKG
7812 INFO: building because E:\true\wuk\app2\build\b\b.exe.manifest changed
7812 INFO: building PKG (CArchive) out00-PKG.pkg
7828 INFO: checking EXE
7843 INFO: rebuilding out00-EXE.toc because pkg is more recent
7843 INFO: building EXE from out00-EXE.toc
7843 INFO: Appending archive to EXE E:\true\wuk\app2\build\b\b.exe
7843 INFO: checking COLLECT
7843 INFO: building COLLECT out00-COLLECT.toc
使用pyinstaller browser.py
,然后在控制台窗口中
QFont::setPixelSize: Pixel size <= 0 (0)
QSslSocket: cannot call unresolved function SSLv23_client_method
QSslSocket: cannot call unresolved function SSL_CTX_new
QSslSocket: cannot call unresolved function SSL_library_init
QSslSocket: cannot call unresolved function ERR_get_error
QSslSocket: cannot call unresolved function SSLv23_client_method
QSslSocket: cannot call unresolved function SSL_CTX_new
QSslSocket: cannot call unresolved function SSL_library_init
QSslSocket: cannot call unresolved function ERR_get_error
QSslSocket: cannot call unresolved function SSLv23_client_method
QSslSocket: cannot call unresolved function SSL_CTX_new
QSslSocket: cannot call unresolved function SSL_library_init
QSslSocket: cannot call unresolved function ERR_get_error
QSslSocket: cannot call unresolved function SSLv23_client_method
QSslSocket: cannot call unresolved function SSL_CTX_new
QSslSocket: cannot call unresolved function SSL_library_init
QSslSocket: cannot call unresolved function ERR_get_error
QFont::setPixelSize: Pixel size <= 0 (0)
答案 0 :(得分:1)
我遇到了同样的问题。它是由PyInstaller使用不正确版本的ssleay32.dll和libeay32.dll引起的。
要修复,下载并安装“Win32 OpenSSL v1.0.1e”。
然后为PyInstaller项目创建一个spec文件:
pyi-makespec browser.py
打开名为browser.spec
的spec文件,在a = Analysis(['browser.py'])
行下方添加:
for d in range(len(a.binaries)):
if a.binaries[d][0].lower() == 'ssleay32.dll':
print a.binaries[d]
a.binaries[d] = ('ssleay32.dll', 'C:\\\OpenSSL-Win32\\ssleay32.dll', 'BINARY')
if a.binaries[d][0].lower() == 'libeay32.dll':
print a.binaries[d]
a.binaries[d] = ('libeay32.dll', 'C:\\OpenSSL-Win32\\libeay32.dll', 'BINARY')
这将告诉PyInstaller使用OpenSSL-Win32 dll而不是Python安装所使用的dll。
运行Python脚本时,我的Python安装首选我的系统路径中的DLL到pyOpenSSL / egenix安装的那些,但是当与PyInstaller捆绑时,它似乎更喜欢pyOpenSSL / egenix。这应该解决这个问题。