用PyInstaller把Python代码打包成单个独立的exe可执行文件


Posted in Python onMay 26, 2018

之前就想要把自己的BlogsToWordpress打开成exe了。一直没去弄。

又看到有人提到python打开成exe的问题。

所以打算现在就去试试。

注:此处之所有选用BlogsToWordpress,是因为此python脚本够复杂,依赖的模块够多。

如果这个都搞定了,那么其他单个的python文件,和小python项目的打包,就更不成问题了。

1.先去找找,目前主流有哪几种方法。

找到几个名字

cx_Freeze

PyInstaller

py2exe

2.关于py2exe和PyInstaller的两者官网:

http://www.py2exe.org/index.cgi/FAQ

http://www.pyinstaller.org/

比较了一下,发现貌似后者更好用。

因为貌似py2exe还需要另外的其他库文件啊啥的,太琐碎。

而PyInstaller:

  • 可以只是生成单独的可执行程序
  • 且支持的版本也多:2.3到2.7都支持。以及x64也支持
  • 也可以自定义图标

所以先去试试PyInstaller。

3.从主页

http://www.pyinstaller.org/

中下载对应的zip包:

https://github.com/downloads/pyinstaller/pyinstaller/pyinstaller-2.0.zip

得到3M+的pyinstaller-2.0.zip,解压,打开cmd,进入对应目录,去安装,结果说不支持:

D:\tmp\dev_tools\python\to_exe\PyInstaller\pyinstaller-2.0>setup.py install
setup.py is not yet supposed to work. Please Use PyInstaller without installation.

所以算了,还是参考官网文档,一点点折腾吧。

4.参考在线文档:

http://www.pyinstaller.org/export/v2.0/project/doc/Manual.html?format=raw

结果说需要PyWin32,所以得先去装这个。

5.后来才发现,原来之前已经安装过了:

【已解决】Python中出错:ImportError: No module named win32com.client

但是要注意的是,import不是pywin32,而是win32com:

Python 2.7.3 (default, Apr 10 2012, 23:24:47) [MSC v.1500 64 bit (AMD64)] on win32
Type "help", "copyright", "credits" or "license" for more information.
>>> import pywin32
Traceback (most recent call last):
 File "<stdin>", line 1, in <module>
ImportError: No module named pywin32
>>> import win32com
>>>

6.继续参考:

Installing PyInstaller

发现,解压后,就算是安装好了。

7.在一个文件夹中,准备好自己的Python程序:

D:\tmp\tmp_dev_root\python\tutorial_summary\make_exe\BlogsToWordpress

以备后用。

8.去到pyinstaller.py所在目录,去运行:

D:\tmp\tmp_dev_root\python\tutorial_summary\make_exe\pyinstaller-2.0>pyinstaller.py ..\BlogsToWordpress\BlogsToWordpress.py
232 INFO: wrote D:\tmp\tmp_dev_root\python\tutorial_summary\make_exe\pyinstaller-2.0\BlogsToWordpress\BlogsToWordpress.spec
250 INFO: Testing for ability to set icons, version resources...
269 INFO: ... resource update available
272 INFO: UPX is not available.
1437 INFO: checking Analysis
1437 INFO: building Analysis because out00-Analysis.toc non existent
1437 INFO: running Analysis out00-Analysis.toc
1439 INFO: Adding Microsoft.VC90.CRT to dependent assemblies of final executable
3074 INFO: Searching for assembly amd64_Microsoft.VC90.CRT_1fc8b3b9a1e18e3b_9.0.21022.8_none ...
3075 INFO: Found manifest C:\Windows\WinSxS\Manifests\amd64_microsoft.vc90.crt_1fc8b3b9a1e18e3b_9.0.21022.8_none_750b37ff97f4f68b.manifest
3081 INFO: Searching for file msvcr90.dll
3081 INFO: Found file C:\Windows\WinSxS\amd64_microsoft.vc90.crt_1fc8b3b9a1e18e3b_9.0.21022.8_none_750b37ff97f4f68b\msvcr90.dll
3081 INFO: Searching for file msvcp90.dll
3082 INFO: Found file C:\Windows\WinSxS\amd64_microsoft.vc90.crt_1fc8b3b9a1e18e3b_9.0.21022.8_none_750b37ff97f4f68b\msvcp90.dll
3082 INFO: Searching for file msvcm90.dll
3082 INFO: Found file C:\Windows\WinSxS\amd64_microsoft.vc90.crt_1fc8b3b9a1e18e3b_9.0.21022.8_none_750b37ff97f4f68b\msvcm90.dll
3292 INFO: Analyzing D:\tmp\tmp_dev_root\python\tutorial_summary\make_exe\pyinstaller-2.0\support\_pyi_bootstrap.py
4048 INFO: Analyzing D:\tmp\tmp_dev_root\python\tutorial_summary\make_exe\pyinstaller-2.0\PyInstaller\loader\archive.py
4101 INFO: Analyzing D:\tmp\tmp_dev_root\python\tutorial_summary\make_exe\pyinstaller-2.0\PyInstaller\loader\carchive.py
4159 INFO: Analyzing D:\tmp\tmp_dev_root\python\tutorial_summary\make_exe\pyinstaller-2.0\PyInstaller\loader\iu.py
4176 INFO: Analyzing ..\BlogsToWordpress\BlogsToWordpress.py
4880 INFO: Hidden import 'encodings' has been found otherwise
4881 INFO: Looking for run-time hooks
4881 INFO: Analyzing rthook D:\tmp\tmp_dev_root\python\tutorial_summary\make_exe\pyinstaller-2.0\support/rthooks/pyi_rth_encodings.py
5523 INFO: Warnings written to D:\tmp\tmp_dev_root\python\tutorial_summary\make_exe\pyinstaller-2.0\BlogsToWordpress\build\pyi.win32\BlogsToWordpress\warnBlogsToWordpress.txt
5528 INFO: checking PYZ
5529 INFO: rebuilding out00-PYZ.toc because out00-PYZ.pyz is missing
5529 INFO: building PYZ out00-PYZ.toc
6225 INFO: checking PKG
6226 INFO: rebuilding out00-PKG.toc because out00-PKG.pkg is missing
6226 INFO: building PKG out00-PKG.pkg
6246 INFO: checking EXE
6246 INFO: rebuilding out00-EXE.toc because BlogsToWordpress.exe missing
6248 INFO: building EXE from out00-EXE.toc
6256 INFO: Appending archive to EXE D:\tmp\tmp_dev_root\python\tutorial_summary\make_exe\pyinstaller-2.0\BlogsToWordpress\build\pyi.win32\BlogsToWordpress\BlogsToWordpress.exe
6259 INFO: checking COLLECT
6259 INFO: building COLLECT out00-COLLECT.toc
 
D:\tmp\tmp_dev_root\python\tutorial_summary\make_exe\pyinstaller-2.0>

可以看到:

当前pyinstaller下面,的确生成了对应的BlogsToWordpress文件夹:

用PyInstaller把Python代码打包成单个独立的exe可执行文件

其下,也有对应的:

用PyInstaller把Python代码打包成单个独立的exe可执行文件

都已经生成了对应的exe了:

用PyInstaller把Python代码打包成单个独立的exe可执行文件

dist下面,有对应的,exe,pyd,dll等等:

用PyInstaller把Python代码打包成单个独立的exe可执行文件

汗,效率也忒高了,我还以为,需要折腾半天才可以呢,?濉!!!?/p>

9.先去试试生成的exe,是否满足我们的需求,是否可以独立运行。

不过运行之前,还是去先研究一下对应的参数吧。

看到了:

What to generate:

-F, --onefile

create a single file deployment

-D, --onedir

create a single directory deployment (default)

-o DIR, --out=DIR

create the spec file in directory. If not specified, and the current directory is Installer's root directory, an output subdirectory will be created. Otherwise the current directory is used.

-n NAME, --name=NAME

optional name to assign to the project (from which the spec file name is generated). If omitted, the basename of the (first) script is used.

很明显,默认用的是-D,所以生成的是带目录的,现在重新去执行一次,使用-F生成单一的文件。

10.删掉旧的。重新运行:

D:\tmp\tmp_dev_root\python\tutorial_summary\make_exe\pyinstaller-2.0>pyinstaller.py -F ..\BlogsToWordpress\BlogsToWordpress.py
39 INFO: wrote D:\tmp\tmp_dev_root\python\tutorial_summary\make_exe\pyinstaller-2.0\BlogsToWordpress\BlogsToWordpress.spec
55 INFO: Testing for ability to set icons, version resources...
62 INFO: ... resource update available
63 INFO: UPX is not available.
848 INFO: checking Analysis
848 INFO: building Analysis because out00-Analysis.toc non existent
849 INFO: running Analysis out00-Analysis.toc
851 INFO: Adding Microsoft.VC90.CRT to dependent assemblies of final executable
905 INFO: Searching for assembly amd64_Microsoft.VC90.CRT_1fc8b3b9a1e18e3b_9.0.21022.8_none ...
907 INFO: Found manifest C:\Windows\WinSxS\Manifests\amd64_microsoft.vc90.crt_1fc8b3b9a1e18e3b_9.0.21022.8_none_750b37ff97f4f68b.manifest
908 INFO: Searching for file msvcr90.dll
908 INFO: Found file C:\Windows\WinSxS\amd64_microsoft.vc90.crt_1fc8b3b9a1e18e3b_9.0.21022.8_none_750b37ff97f4f68b\msvcr90.dll
911 INFO: Searching for file msvcp90.dll
911 INFO: Found file C:\Windows\WinSxS\amd64_microsoft.vc90.crt_1fc8b3b9a1e18e3b_9.0.21022.8_none_750b37ff97f4f68b\msvcp90.dll
912 INFO: Searching for file msvcm90.dll
914 INFO: Found file C:\Windows\WinSxS\amd64_microsoft.vc90.crt_1fc8b3b9a1e18e3b_9.0.21022.8_none_750b37ff97f4f68b\msvcm90.dll
987 INFO: Analyzing D:\tmp\tmp_dev_root\python\tutorial_summary\make_exe\pyinstaller-2.0\support\_pyi_bootstrap.py
1639 INFO: Analyzing D:\tmp\tmp_dev_root\python\tutorial_summary\make_exe\pyinstaller-2.0\PyInstaller\loader\archive.py
1694 INFO: Analyzing D:\tmp\tmp_dev_root\python\tutorial_summary\make_exe\pyinstaller-2.0\PyInstaller\loader\carchive.py
1750 INFO: Analyzing D:\tmp\tmp_dev_root\python\tutorial_summary\make_exe\pyinstaller-2.0\PyInstaller\loader\iu.py
1766 INFO: Analyzing ..\BlogsToWordpress\BlogsToWordpress.py
2246 INFO: Hidden import 'encodings' has been found otherwise
2247 INFO: Looking for run-time hooks
2249 INFO: Analyzing rthook D:\tmp\tmp_dev_root\python\tutorial_summary\make_exe\pyinstaller-2.0\support/rthooks/pyi_rth_encodings.py
2608 INFO: Warnings written to D:\tmp\tmp_dev_root\python\tutorial_summary\make_exe\pyinstaller-2.0\BlogsToWordpress\build\pyi.win32\BlogsToWordpress\warnBlogsToWordpress.txt
2611 INFO: checking PYZ
2612 INFO: rebuilding out00-PYZ.toc because out00-PYZ.pyz is missing
2613 INFO: building PYZ out00-PYZ.toc
3290 INFO: checking PKG
3290 INFO: rebuilding out00-PKG.toc because out00-PKG.pkg is missing
3292 INFO: building PKG out00-PKG.pkg
4784 INFO: checking EXE
4784 INFO: rebuilding out00-EXE.toc because BlogsToWordpress.exe missing
4786 INFO: building EXE from out00-EXE.toc
4793 INFO: Appending archive to EXE D:\tmp\tmp_dev_root\python\tutorial_summary\make_exe\pyinstaller-2.0\BlogsToWordpress\dist\BlogsToWordpress.exe

去看看结果。

pyinstaller-2.0\BlogsToWordpress\build\pyi.win32\BlogsToWordpress

下面包含很多toc,pkg,pyz等文件:

用PyInstaller把Python代码打包成单个独立的exe可执行文件

dist下面,就生成了,所需要的单个exe文件:

用PyInstaller把Python代码打包成单个独立的exe可执行文件

但是,注意到了,生成文件中,包含一个警告的文件:

D:\tmp\tmp_dev_root\python\tutorial_summary\make_exe\pyinstaller-2.0\BlogsToWordpress\build\pyi.win32\BlogsToWordpress\warnBlogsToWordpress.txt

W: no module named org (delayed import by xml.sax)
W: no module named _scproxy (conditional import by urllib)
W: no module named cl (delayed, conditional import by aifc)
W: no module named pwd (delayed, conditional import by posixpath)
W: no module named org (top-level import by pickle)
W: no module named Carbon (delayed import by plistlib)
W: no module named posix (delayed, conditional import by __main__)
W: no module named fcntl (conditional import by subprocess)
W: no module named BlogBaidu (top-level import by __main__)
W: no module named BlogCsdn (top-level import by __main__)
W: no module named BlogBlogbus (top-level import by __main__)
W: no module named java (conditional import by xml.sax._exceptions)
W: no module named BlogTianya (top-level import by __main__)
W: no module named readline (delayed import by pdb)
W: no module named AES (delayed, conditional import by archive)
W: no module named _emx_link (conditional import by os)
W: no module named pwd (delayed import by getpass)
W: no module named posix (delayed, conditional import by iu)
W: no module named EasyDialogs (conditional import by getpass)
W: no module named termios (top-level import by getpass)
W: no module named gestalt (delayed import by platform)
W: no module named org (top-level import by copy)
W: no module named fcntl (top-level import by tempfile)
W: no module named readline (delayed, conditional import by cmd)
W: no module named crifanLib (top-level import by __main__)
W: no module named SOCKS (top-level import by ftplib)
W: no module named java (delayed import by platform)
W: no module named cl (delayed import by aifc)
W: no module named BlogQQ (top-level import by __main__)
W: no module named xmlparse (top-level import by pyexpat)
W: no module named xmltok (top-level import by pyexpat)
W: no module named BlogDiandian (top-level import by __main__)
W: no module named BlogSohu (top-level import by __main__)
W: no module named BlogRenren (top-level import by __main__)
W: no module named AES (delayed, conditional import by __main__)
W: no module named posix (conditional import by os)
W: no module named BlogNetease (top-level import by __main__)
W: no module named MacOS (delayed import by platform)
W: no module named vms_lib (delayed, conditional import by platform)
W: no module named rourl2path (conditional import by urllib)
W: no module named _xmlplus (top-level import by xml)
W: no module named Crypt (delayed, conditional import by __main__)
W: no module named BlogSina (top-level import by __main__)
W: delayed  exec statement detected at line 0 - bdb (D:\tmp\dev_install_root\Python27_x64\lib\bdb.pyc)
W: delayed  eval hack detected at line 0 - bdb (D:\tmp\dev_install_root\Python27_x64\lib\bdb.pyc)
W: delayed  eval hack detected at line 0 - bdb (D:\tmp\dev_install_root\Python27_x64\lib\bdb.pyc)
W: delayed  __import__ hack detected at line 0 - optparse (D:\tmp\dev_install_root\Python27_x64\lib\optparse.pyc)
W: delayed conditional __import__ hack detected at line 0 - doctest (D:\tmp\dev_install_root\Python27_x64\lib\doctest.pyc)
W: delayed  exec statement detected at line 0 - doctest (D:\tmp\dev_install_root\Python27_x64\lib\doctest.pyc)
W: delayed conditional __import__ hack detected at line 0 - doctest (D:\tmp\dev_install_root\Python27_x64\lib\doctest.pyc)
W: __all__ is built strangely at line 0 - tokenize (D:\tmp\dev_install_root\Python27_x64\lib\tokenize.pyc)
W: __all__ is built strangely at line 0 - tokenize (D:\tmp\dev_install_root\Python27_x64\lib\tokenize.pyc)
W: delayed  __import__ hack detected at line 0 - pickle (D:\tmp\dev_install_root\Python27_x64\lib\pickle.pyc)
W: delayed  __import__ hack detected at line 0 - pickle (D:\tmp\dev_install_root\Python27_x64\lib\pickle.pyc)
W: delayed  __import__ hack detected at line 0 - encodings (D:\tmp\dev_install_root\Python27_x64\lib\encodings\__init__.pyc)
W: __all__ is built strangely at line 0 - dis (D:\tmp\dev_install_root\Python27_x64\lib\dis.pyc)
W: __all__ is built strangely at line 0 - hashlib (D:\tmp\dev_install_root\Python27_x64\lib\hashlib.pyc)
W: delayed conditional eval hack detected at line 0 - warnings (D:\tmp\dev_install_root\Python27_x64\lib\warnings.pyc)
W: delayed conditional __import__ hack detected at line 0 - warnings (D:\tmp\dev_install_root\Python27_x64\lib\warnings.pyc)
W: delayed  __import__ hack detected at line 0 - email (D:\tmp\dev_install_root\Python27_x64\lib\email\__init__.pyc)
W: delayed  exec statement detected at line 0 - pdb (D:\tmp\dev_install_root\Python27_x64\lib\pdb.pyc)
W: delayed conditional eval hack detected at line 0 - pdb (D:\tmp\dev_install_root\Python27_x64\lib\pdb.pyc)
W: delayed  eval hack detected at line 0 - pdb (D:\tmp\dev_install_root\Python27_x64\lib\pdb.pyc)
W: delayed conditional eval hack detected at line 0 - pdb (D:\tmp\dev_install_root\Python27_x64\lib\pdb.pyc)
W: delayed  eval hack detected at line 0 - pdb (D:\tmp\dev_install_root\Python27_x64\lib\pdb.pyc)
W: delayed conditional exec statement detected at line 0 - iu (D:\tmp\tmp_dev_root\python\tutorial_summary\make_exe\pyinstaller-2.0\PyInstaller\loader\iu.pyc)
W: delayed conditional exec statement detected at line 0 - iu (D:\tmp\tmp_dev_root\python\tutorial_summary\make_exe\pyinstaller-2.0\PyInstaller\loader\iu.pyc)
W: __all__ is built strangely at line 0 - collections (D:\tmp\dev_install_root\Python27_x64\lib\collections.pyc)
W: delayed  exec statement detected at line 0 - collections (D:\tmp\dev_install_root\Python27_x64\lib\collections.pyc)
W: delayed conditional __import__ hack detected at line 0 - unittest.main (D:\tmp\dev_install_root\Python27_x64\lib\unittest\main.pyc)
W: delayed conditional __import__ hack detected at line 0 - unittest.loader (D:\tmp\dev_install_root\Python27_x64\lib\unittest\loader.pyc)
W: delayed conditional __import__ hack detected at line 0 - unittest.loader (D:\tmp\dev_install_root\Python27_x64\lib\unittest\loader.pyc)
W: delayed  __import__ hack detected at line 0 - unittest.loader (D:\tmp\dev_install_root\Python27_x64\lib\unittest\loader.pyc)
W: __all__ is built strangely at line 0 - __future__ (D:\tmp\dev_install_root\Python27_x64\lib\__future__.pyc)
W: delayed  __import__ hack detected at line 0 - xml.sax (D:\tmp\dev_install_root\Python27_x64\lib\xml\sax\__init__.pyc)
W: delayed  eval hack detected at line 0 - gettext (D:\tmp\dev_install_root\Python27_x64\lib\gettext.pyc)

不知道是否影响程序。

11.去运行单个的exe,看看效果。

结果直接出错:

D:\tmp\tmp_dev_root\python\tutorial_summary\make_exe\pyinstaller-2.0\BlogsToWordpress\dist>BlogsToWordpress.exe
Traceback (most recent call last):
 File "<string>", line 127, in <module>
 File "D:\tmp\tmp_dev_root\python\tutorial_summary\make_exe\pyinstaller-2.0\PyInstaller\loader\iu.py", line 409, in importHook
  raise ImportError("No module named %s" % fqname)
ImportError: No module named crifanLib

很明显,还是无法自动导入很多的库啊。

去想办法,添加搜索路径,让其找到对应的库。

12.好像是-p参数:

-p DIR, --paths=DIR

set base path for import (like using PYTHONPATH). Multiple directories are allowed, separating them with the path separator (‘;' under Windows, ‘:' under Linux), or using this option multiple times.

去试试:

D:\tmp\tmp_dev_root\python\tutorial_summary\make_exe\pyinstaller-2.0>pyinstaller.py -F -p D:\tmp\tmp_dev_root\python\tutorial_summary\make_exe\BlogsToWordpress\libs;D:\tmp\tmp_dev_root\python\tutorial
_summary\make_exe\BlogsToWordpress\libs\crifan;D:\tmp\tmp_dev_root\python\tutorial_summary\make_exe\BlogsToWordpress\libs\crifan\blogModules;D:\tmp\tmp_dev_root\python\tutorial_summary\make_exe\BlogsT
oWordpress\libs\thirdparty;D:\tmp\tmp_dev_root\python\tutorial_summary\make_exe\BlogsToWordpress\libs\thirdparty\chardet; ..\BlogsToWordpress\BlogsToWordpress.py
18 INFO: wrote D:\tmp\tmp_dev_root\python\tutorial_summary\make_exe\pyinstaller-2.0\BlogsToWordpress\BlogsToWordpress.spec
33 INFO: Testing for ability to set icons, version resources...
36 INFO: ... resource update available
39 INFO: UPX is not available.
674 INFO: checking Analysis
677 INFO: building because pathex changed
679 INFO: running Analysis out00-Analysis.toc
680 INFO: Adding Microsoft.VC90.CRT to dependent assemblies of final executable
733 INFO: Searching for assembly amd64_Microsoft.VC90.CRT_1fc8b3b9a1e18e3b_9.0.21022.8_none ...
735 INFO: Found manifest C:\Windows\WinSxS\Manifests\amd64_microsoft.vc90.crt_1fc8b3b9a1e18e3b_9.0.21022.8_none_750b37ff97f4f68b.manifest
736 INFO: Searching for file msvcr90.dll
736 INFO: Found file C:\Windows\WinSxS\amd64_microsoft.vc90.crt_1fc8b3b9a1e18e3b_9.0.21022.8_none_750b37ff97f4f68b\msvcr90.dll
738 INFO: Searching for file msvcp90.dll
739 INFO: Found file C:\Windows\WinSxS\amd64_microsoft.vc90.crt_1fc8b3b9a1e18e3b_9.0.21022.8_none_750b37ff97f4f68b\msvcp90.dll
740 INFO: Searching for file msvcm90.dll
743 INFO: Found file C:\Windows\WinSxS\amd64_microsoft.vc90.crt_1fc8b3b9a1e18e3b_9.0.21022.8_none_750b37ff97f4f68b\msvcm90.dll
812 INFO: Analyzing D:\tmp\tmp_dev_root\python\tutorial_summary\make_exe\pyinstaller-2.0\support\_pyi_bootstrap.py
1512 INFO: Analyzing D:\tmp\tmp_dev_root\python\tutorial_summary\make_exe\pyinstaller-2.0\PyInstaller\loader\archive.py
1578 INFO: Analyzing D:\tmp\tmp_dev_root\python\tutorial_summary\make_exe\pyinstaller-2.0\PyInstaller\loader\carchive.py
1648 INFO: Analyzing D:\tmp\tmp_dev_root\python\tutorial_summary\make_exe\pyinstaller-2.0\PyInstaller\loader\iu.py
1667 INFO: Analyzing ..\BlogsToWordpress\BlogsToWordpress.py
3016 INFO: Hidden import 'encodings' has been found otherwise
3016 INFO: Looking for run-time hooks
3018 INFO: Analyzing rthook D:\tmp\tmp_dev_root\python\tutorial_summary\make_exe\pyinstaller-2.0\support/rthooks/pyi_rth_encodings.py
3670 INFO: Warnings written to D:\tmp\tmp_dev_root\python\tutorial_summary\make_exe\pyinstaller-2.0\BlogsToWordpress\build\pyi.win32\BlogsToWordpress\warnBlogsToWordpress.txt
3674 INFO: checking PYZ
3679 INFO: building because toc changed
3679 INFO: building PYZ out00-PYZ.toc
5713 INFO: checking PKG
5716 INFO: building because D:\tmp\tmp_dev_root\python\tutorial_summary\make_exe\pyinstaller-2.0\BlogsToWordpress\build\pyi.win32\BlogsToWordpress\out00-PYZ.pyz changed
5717 INFO: building PKG out00-PKG.pkg
7163 INFO: checking EXE
7164 INFO: rebuilding out00-EXE.toc because pkg is more recent
7164 INFO: building EXE from out00-EXE.toc
7167 INFO: Appending archive to EXE D:\tmp\tmp_dev_root\python\tutorial_summary\make_exe\pyinstaller-2.0\BlogsToWordpress\dist\BlogsToWordpress.exe
 
D:\tmp\tmp_dev_root\python\tutorial_summary\make_exe\pyinstaller-2.0>

添加上路径后,生成的exe,的确也大了一点,变成4505KB了:

用PyInstaller把Python代码打包成单个独立的exe可执行文件

另外,warnBlogsToWordpress.txt中,的确没了crifanLib,但是还是有一些其他,可能要依赖的库:

W: no module named org (delayed import by xml.sax)
W: no module named PIL (delayed import by BlogRenren)
W: no module named _dummy_threading (top-level import by dummy_threading)
W: no module named cl (delayed, conditional import by aifc)
W: no module named pwd (delayed, conditional import by posixpath)
W: no module named org (top-level import by pickle)
W: no module named Carbon (delayed import by plistlib)
W: no module named PIL (delayed, conditional import by BlogNetease)
W: no module named posix (delayed, conditional import by __main__)
W: no module named iconv_codec (top-level import by BeautifulSoup)
W: no module named fcntl (conditional import by subprocess)
W: no module named MacOS (delayed import by platform)
W: no module named readline (delayed import by pdb)
W: no module named AES (delayed, conditional import by archive)
W: no module named _scproxy (conditional import by urllib)
W: no module named pwd (delayed import by getpass)
W: no module named posix (delayed, conditional import by iu)
W: no module named EasyDialogs (conditional import by getpass)
W: no module named termios (top-level import by getpass)
W: no module named gestalt (delayed import by platform)
W: no module named org (top-level import by copy)
W: no module named fcntl (top-level import by tempfile)
W: no module named cjkcodecs (top-level import by BeautifulSoup)
W: no module named readline (delayed, conditional import by cmd)
W: no module named java (delayed import by platform)
W: no module named cl (delayed import by aifc)
W: no module named xmlparse (top-level import by pyexpat)
W: no module named xmltok (top-level import by pyexpat)
W: no module named java (conditional import by xml.sax._exceptions)
W: no module named _emx_link (conditional import by os)
W: no module named posix (conditional import by os)
W: no module named rourl2path (conditional import by urllib)
W: no module named vms_lib (delayed, conditional import by platform)
W: no module named SOCKS (top-level import by ftplib)
W: no module named _xmlplus (top-level import by xml)
W: no module named Crypt (delayed, conditional import by __main__)
W: no module named AES (delayed, conditional import by __main__)
W: delayed  exec statement detected at line 0 - bdb (D:\tmp\dev_install_root\Python27_x64\lib\bdb.pyc)
W: delayed  eval hack detected at line 0 - bdb (D:\tmp\dev_install_root\Python27_x64\lib\bdb.pyc)
W: delayed  eval hack detected at line 0 - bdb (D:\tmp\dev_install_root\Python27_x64\lib\bdb.pyc)
W: delayed  __import__ hack detected at line 0 - optparse (D:\tmp\dev_install_root\Python27_x64\lib\optparse.pyc)
W: delayed conditional __import__ hack detected at line 0 - doctest (D:\tmp\dev_install_root\Python27_x64\lib\doctest.pyc)
W: delayed  exec statement detected at line 0 - doctest (D:\tmp\dev_install_root\Python27_x64\lib\doctest.pyc)
W: delayed conditional __import__ hack detected at line 0 - doctest (D:\tmp\dev_install_root\Python27_x64\lib\doctest.pyc)
W: __all__ is built strangely at line 0 - tokenize (D:\tmp\dev_install_root\Python27_x64\lib\tokenize.pyc)
W: __all__ is built strangely at line 0 - tokenize (D:\tmp\dev_install_root\Python27_x64\lib\tokenize.pyc)
W: delayed  __import__ hack detected at line 0 - pickle (D:\tmp\dev_install_root\Python27_x64\lib\pickle.pyc)
W: delayed  __import__ hack detected at line 0 - pickle (D:\tmp\dev_install_root\Python27_x64\lib\pickle.pyc)
W: delayed  __import__ hack detected at line 0 - encodings (D:\tmp\dev_install_root\Python27_x64\lib\encodings\__init__.pyc)
W: __all__ is built strangely at line 0 - dummy_threading (D:\tmp\dev_install_root\Python27_x64\lib\dummy_threading.pyc)
W: __all__ is built strangely at line 0 - dis (D:\tmp\dev_install_root\Python27_x64\lib\dis.pyc)
W: __all__ is built strangely at line 0 - hashlib (D:\tmp\dev_install_root\Python27_x64\lib\hashlib.pyc)
W: delayed conditional eval hack detected at line 0 - warnings (D:\tmp\dev_install_root\Python27_x64\lib\warnings.pyc)
W: delayed conditional __import__ hack detected at line 0 - warnings (D:\tmp\dev_install_root\Python27_x64\lib\warnings.pyc)
W: delayed  __import__ hack detected at line 0 - email (D:\tmp\dev_install_root\Python27_x64\lib\email\__init__.pyc)
W: delayed  exec statement detected at line 0 - pdb (D:\tmp\dev_install_root\Python27_x64\lib\pdb.pyc)
W: delayed conditional eval hack detected at line 0 - pdb (D:\tmp\dev_install_root\Python27_x64\lib\pdb.pyc)
W: delayed  eval hack detected at line 0 - pdb (D:\tmp\dev_install_root\Python27_x64\lib\pdb.pyc)
W: delayed conditional eval hack detected at line 0 - pdb (D:\tmp\dev_install_root\Python27_x64\lib\pdb.pyc)
W: delayed  eval hack detected at line 0 - pdb (D:\tmp\dev_install_root\Python27_x64\lib\pdb.pyc)
W: delayed conditional exec statement detected at line 0 - iu (D:\tmp\tmp_dev_root\python\tutorial_summary\make_exe\pyinstaller-2.0\PyInstaller\loader\iu.pyc)
W: delayed conditional exec statement detected at line 0 - iu (D:\tmp\tmp_dev_root\python\tutorial_summary\make_exe\pyinstaller-2.0\PyInstaller\loader\iu.pyc)
W: __all__ is built strangely at line 0 - collections (D:\tmp\dev_install_root\Python27_x64\lib\collections.pyc)
W: delayed  exec statement detected at line 0 - collections (D:\tmp\dev_install_root\Python27_x64\lib\collections.pyc)
W: delayed conditional __import__ hack detected at line 0 - unittest.main (D:\tmp\dev_install_root\Python27_x64\lib\unittest\main.pyc)
W: delayed conditional __import__ hack detected at line 0 - unittest.loader (D:\tmp\dev_install_root\Python27_x64\lib\unittest\loader.pyc)
W: delayed conditional __import__ hack detected at line 0 - unittest.loader (D:\tmp\dev_install_root\Python27_x64\lib\unittest\loader.pyc)
W: delayed  __import__ hack detected at line 0 - unittest.loader (D:\tmp\dev_install_root\Python27_x64\lib\unittest\loader.pyc)
W: __all__ is built strangely at line 0 - __future__ (D:\tmp\dev_install_root\Python27_x64\lib\__future__.pyc)
W: delayed  __import__ hack detected at line 0 - xml.sax (D:\tmp\dev_install_root\Python27_x64\lib\xml\sax\__init__.pyc)
W: delayed  eval hack detected at line 0 - gettext (D:\tmp\dev_install_root\Python27_x64\lib\gettext.pyc)

比如,其中的PIL等库。 

不过,关于PIL,我去看了看自己的

D:\tmp\dev_install_root\Python27_x64\Lib\site-packages

中的确没有,应该是重装python,导致了之前安装好的PIL没了。

所以,还是需要自己重新安装一下PIL的。

12.关于安装PIL的过程,详见:

【记录】下载和安装Python的第三方图像处理的库:PIL(Python Imaging Library)

13.然后再去

D:\tmp\dev_install_root\Python27_x64\Lib\site-packages

确认一下,果然有了PIL了。

然后此处,删掉旧的,重新执行一次:

D:\tmp\tmp_dev_root\python\tutorial_summary\make_exe\pyinstaller-2.0>pyinstaller.py -F -p D:\tmp\tmp_dev_root\python\tutorial_summary\make_exe\BlogsToWordpress\libs;D:\tmp\tmp_dev_root\python\tutorial
_summary\make_exe\BlogsToWordpress\libs\crifan;D:\tmp\tmp_dev_root\python\tutorial_summary\make_exe\BlogsToWordpress\libs\crifan\blogModules;D:\tmp\tmp_dev_root\python\tutorial_summary\make_exe\BlogsT
oWordpress\libs\thirdparty;D:\tmp\tmp_dev_root\python\tutorial_summary\make_exe\BlogsToWordpress\libs\thirdparty\chardet; ..\BlogsToWordpress\BlogsToWordpress.py
18 INFO: wrote D:\tmp\tmp_dev_root\python\tutorial_summary\make_exe\pyinstaller-2.0\BlogsToWordpress\BlogsToWordpress.spec
33 INFO: Testing for ability to set icons, version resources...
37 INFO: ... resource update available
39 INFO: UPX is not available.
684 INFO: checking Analysis
684 INFO: building Analysis because out00-Analysis.toc non existent
684 INFO: running Analysis out00-Analysis.toc
685 INFO: Adding Microsoft.VC90.CRT to dependent assemblies of final executable
740 INFO: Searching for assembly amd64_Microsoft.VC90.CRT_1fc8b3b9a1e18e3b_9.0.21022.8_none ...
741 INFO: Found manifest C:\Windows\WinSxS\Manifests\amd64_microsoft.vc90.crt_1fc8b3b9a1e18e3b_9.0.21022.8_none_750b37ff97f4f68b.manifest
742 INFO: Searching for file msvcr90.dll
743 INFO: Found file C:\Windows\WinSxS\amd64_microsoft.vc90.crt_1fc8b3b9a1e18e3b_9.0.21022.8_none_750b37ff97f4f68b\msvcr90.dll
744 INFO: Searching for file msvcp90.dll
745 INFO: Found file C:\Windows\WinSxS\amd64_microsoft.vc90.crt_1fc8b3b9a1e18e3b_9.0.21022.8_none_750b37ff97f4f68b\msvcp90.dll
747 INFO: Searching for file msvcm90.dll
750 INFO: Found file C:\Windows\WinSxS\amd64_microsoft.vc90.crt_1fc8b3b9a1e18e3b_9.0.21022.8_none_750b37ff97f4f68b\msvcm90.dll
821 INFO: Analyzing D:\tmp\tmp_dev_root\python\tutorial_summary\make_exe\pyinstaller-2.0\support\_pyi_bootstrap.py
1531 INFO: Analyzing D:\tmp\tmp_dev_root\python\tutorial_summary\make_exe\pyinstaller-2.0\PyInstaller\loader\archive.py
1600 INFO: Analyzing D:\tmp\tmp_dev_root\python\tutorial_summary\make_exe\pyinstaller-2.0\PyInstaller\loader\carchive.py
1672 INFO: Analyzing D:\tmp\tmp_dev_root\python\tutorial_summary\make_exe\pyinstaller-2.0\PyInstaller\loader\iu.py
1692 INFO: Analyzing ..\BlogsToWordpress\BlogsToWordpress.py
2903 INFO: Hidden import 'encodings' has been found otherwise
2904 INFO: Looking for run-time hooks
2905 INFO: Analyzing rthook D:\tmp\tmp_dev_root\python\tutorial_summary\make_exe\pyinstaller-2.0\support/rthooks/pyi_rth_PIL_Image.py
2917 INFO: Analyzing rthook D:\tmp\tmp_dev_root\python\tutorial_summary\make_exe\pyinstaller-2.0\support/rthooks/pyi_rth_encodings.py
3319 INFO: Warnings written to D:\tmp\tmp_dev_root\python\tutorial_summary\make_exe\pyinstaller-2.0\BlogsToWordpress\build\pyi.win32\BlogsToWordpress\warnBlogsToWordpress.txt
3325 INFO: checking PYZ
3326 INFO: rebuilding out00-PYZ.toc because out00-PYZ.pyz is missing
3326 INFO: building PYZ out00-PYZ.toc
5360 INFO: checking PKG
5360 INFO: rebuilding out00-PKG.toc because out00-PKG.pkg is missing
5361 INFO: building PKG out00-PKG.pkg
6839 INFO: checking EXE
6839 INFO: rebuilding out00-EXE.toc because BlogsToWordpress.exe missing
6840 INFO: building EXE from out00-EXE.toc
6842 INFO: Appending archive to EXE D:\tmp\tmp_dev_root\python\tutorial_summary\make_exe\pyinstaller-2.0\BlogsToWordpress\dist\BlogsToWordpress.exe
 
D:\tmp\tmp_dev_root\python\tutorial_summary\make_exe\pyinstaller-2.0>

虽然结果警告中,也还是有PIL:

W: no module named org (delayed import by xml.sax)
W: no module named _dummy_threading (top-level import by dummy_threading)
W: no module named cl (delayed, conditional import by aifc)
W: no module named pwd (delayed, conditional import by posixpath)
W: no module named org (top-level import by pickle)
W: no module named Carbon (delayed import by plistlib)
W: no module named posix (delayed, conditional import by __main__)
W: no module named iconv_codec (top-level import by BeautifulSoup)
W: no module named fcntl (conditional import by subprocess)
W: no module named MacOS (delayed import by platform)
W: no module named readline (delayed import by pdb)
W: no module named AES (delayed, conditional import by archive)
W: no module named _scproxy (conditional import by urllib)
W: no module named pwd (delayed import by getpass)
W: no module named posix (delayed, conditional import by iu)
W: no module named EasyDialogs (conditional import by getpass)
W: no module named termios (top-level import by getpass)
W: no module named gestalt (delayed import by platform)
W: no module named org (top-level import by copy)
W: no module named _imaging_gif (top-level import by PIL.GifImagePlugin)
W: no module named fcntl (top-level import by tempfile)
W: no module named cjkcodecs (top-level import by BeautifulSoup)
W: no module named readline (delayed, conditional import by cmd)
W: no module named java (delayed import by platform)
W: no module named cl (delayed import by aifc)
W: no module named xmlparse (top-level import by pyexpat)
W: no module named xmltok (top-level import by pyexpat)
W: no module named java (conditional import by xml.sax._exceptions)
W: no module named _emx_link (conditional import by os)
W: no module named posix (conditional import by os)
W: no module named ICCProfile (delayed, conditional import by PIL.PngImagePlugin)
W: no module named rourl2path (conditional import by urllib)
W: no module named vms_lib (delayed, conditional import by platform)
W: no module named SOCKS (top-level import by ftplib)
W: no module named _xmlplus (top-level import by xml)
W: no module named Crypt (delayed, conditional import by __main__)
W: no module named AES (delayed, conditional import by __main__)
W: delayed  exec statement detected at line 0 - bdb (D:\tmp\dev_install_root\Python27_x64\lib\bdb.pyc)
W: delayed  eval hack detected at line 0 - bdb (D:\tmp\dev_install_root\Python27_x64\lib\bdb.pyc)
W: delayed  eval hack detected at line 0 - bdb (D:\tmp\dev_install_root\Python27_x64\lib\bdb.pyc)
W: delayed  __import__ hack detected at line 0 - optparse (D:\tmp\dev_install_root\Python27_x64\lib\optparse.pyc)
W: delayed  __import__ hack detected at line 0 - PIL.Image (D:\tmp\dev_install_root\Python27_x64\lib\site-packages\PIL\Image.pyc)
W: delayed conditional __import__ hack detected at line 0 - doctest (D:\tmp\dev_install_root\Python27_x64\lib\doctest.pyc)
W: delayed  exec statement detected at line 0 - doctest (D:\tmp\dev_install_root\Python27_x64\lib\doctest.pyc)
W: delayed conditional __import__ hack detected at line 0 - doctest (D:\tmp\dev_install_root\Python27_x64\lib\doctest.pyc)
W: __all__ is built strangely at line 0 - tokenize (D:\tmp\dev_install_root\Python27_x64\lib\tokenize.pyc)
W: __all__ is built strangely at line 0 - tokenize (D:\tmp\dev_install_root\Python27_x64\lib\tokenize.pyc)
W: delayed  __import__ hack detected at line 0 - pickle (D:\tmp\dev_install_root\Python27_x64\lib\pickle.pyc)
W: delayed  __import__ hack detected at line 0 - pickle (D:\tmp\dev_install_root\Python27_x64\lib\pickle.pyc)
W: delayed  __import__ hack detected at line 0 - encodings (D:\tmp\dev_install_root\Python27_x64\lib\encodings\__init__.pyc)
W: __all__ is built strangely at line 0 - dummy_threading (D:\tmp\dev_install_root\Python27_x64\lib\dummy_threading.pyc)
W: __all__ is built strangely at line 0 - dis (D:\tmp\dev_install_root\Python27_x64\lib\dis.pyc)
W: __all__ is built strangely at line 0 - hashlib (D:\tmp\dev_install_root\Python27_x64\lib\hashlib.pyc)
W: delayed conditional eval hack detected at line 0 - warnings (D:\tmp\dev_install_root\Python27_x64\lib\warnings.pyc)
W: delayed conditional __import__ hack detected at line 0 - warnings (D:\tmp\dev_install_root\Python27_x64\lib\warnings.pyc)
W: delayed  __import__ hack detected at line 0 - email (D:\tmp\dev_install_root\Python27_x64\lib\email\__init__.pyc)
W: delayed  exec statement detected at line 0 - pdb (D:\tmp\dev_install_root\Python27_x64\lib\pdb.pyc)
W: delayed conditional eval hack detected at line 0 - pdb (D:\tmp\dev_install_root\Python27_x64\lib\pdb.pyc)
W: delayed  eval hack detected at line 0 - pdb (D:\tmp\dev_install_root\Python27_x64\lib\pdb.pyc)
W: delayed conditional eval hack detected at line 0 - pdb (D:\tmp\dev_install_root\Python27_x64\lib\pdb.pyc)
W: delayed  eval hack detected at line 0 - pdb (D:\tmp\dev_install_root\Python27_x64\lib\pdb.pyc)
W: delayed conditional exec statement detected at line 0 - iu (D:\tmp\tmp_dev_root\python\tutorial_summary\make_exe\pyinstaller-2.0\PyInstaller\loader\iu.pyc)
W: delayed conditional exec statement detected at line 0 - iu (D:\tmp\tmp_dev_root\python\tutorial_summary\make_exe\pyinstaller-2.0\PyInstaller\loader\iu.pyc)
W: __all__ is built strangely at line 0 - collections (D:\tmp\dev_install_root\Python27_x64\lib\collections.pyc)
W: delayed  exec statement detected at line 0 - collections (D:\tmp\dev_install_root\Python27_x64\lib\collections.pyc)
W: delayed conditional __import__ hack detected at line 0 - unittest.main (D:\tmp\dev_install_root\Python27_x64\lib\unittest\main.pyc)
W: delayed conditional __import__ hack detected at line 0 - unittest.loader (D:\tmp\dev_install_root\Python27_x64\lib\unittest\loader.pyc)
W: delayed conditional __import__ hack detected at line 0 - unittest.loader (D:\tmp\dev_install_root\Python27_x64\lib\unittest\loader.pyc)
W: delayed  __import__ hack detected at line 0 - unittest.loader (D:\tmp\dev_install_root\Python27_x64\lib\unittest\loader.pyc)
W: __all__ is built strangely at line 0 - __future__ (D:\tmp\dev_install_root\Python27_x64\lib\__future__.pyc)
W: delayed  __import__ hack detected at line 0 - xml.sax (D:\tmp\dev_install_root\Python27_x64\lib\xml\sax\__init__.pyc)
W: delayed  eval hack detected at line 0 - gettext (D:\tmp\dev_install_root\Python27_x64\lib\gettext.pyc)

但是很明显,只是PIL模块内部的一些小问题罢了,不理会。

生成的exe,的确又变大了,4748KB:

用PyInstaller把Python代码打包成单个独立的exe可执行文件

13.去运行现在的最新的BlogsToWordpress.exe,看看效果如何。

果然是可以,如期望的一样,去执行了:

D:\tmp\tmp_dev_root\python\tutorial_summary\make_exe\pyinstaller-2.0\BlogsToWordpress\dist>BlogsToWordpress.exe
Imported: crifanLib,    v2.4
Imported: BlogNetease,  v1.4
Imported: BlogBaidu,    v3.4
Imported: BlogSina,     v1.5
Imported: BlogQQ,       v1.8
Imported: BlogCsdn,     v1.1
Imported: BlogSohu,     v1.3
LINE 1600 : INFO     Current runtime info:
LINE 1600 : INFO     Paramenters       : ['D:\\tmp\\tmp_dev_root\\python\\tutorial_summary\\make_exe\\pyinstaller-2.0\\BlogsToWordpress\\dist\\BlogsToWordpress.exe']
LINE 1600 : INFO     Python version    : sys.version_info(major=2, minor=7, micro=3, releaselevel='final', serial=0)
LINE 1600 : INFO     platform.machine()=AMD64
LINE 1600 : INFO     platform.node()=PC-CLI-1
LINE 1600 : INFO     platform.platform()=Windows-7-6.1.7601-SP1
LINE 1600 : INFO     platform.processor()=Intel64 Family 6 Model 42 Stepping 7, GenuineIntel
LINE 1600 : INFO     platform.python_build()=('default', 'Apr 10 2012 23:24:47')
LINE 1600 : INFO     platform.python_compiler()=MSC v.1500 64 bit (AMD64)
LINE 1600 : INFO     platform.python_branch()=
LINE 1600 : INFO     platform.python_implementation()=CPython
LINE 1600 : INFO     platform.python_revision()=
LINE 1600 : INFO     platform.python_version()=2.7.3
LINE 1600 : INFO     platform.python_version_tuple()=('2', '7', '3')
LINE 1600 : INFO     platform.release()=7
LINE 1600 : INFO     platform.system()=Windows
LINE 1600 : INFO     platform.version()=6.1.7601
LINE 1600 : INFO     platform.uname()=('Windows', 'PC-CLI-1', '7', '6.1.7601', 'AMD64', 'Intel64 Family 6 Model 42 Stepping 7, GenuineIntel')
LINE 1600 : INFO     Default encoding  : ascii
LINE 1600 : INFO     Current path      : C:\Users\CLi\AppData\Local\Temp\_MEI252922
LINE 1600 : INFO     版本信息:v16.8
LINE 1600 : INFO     1.如果脚本运行出错,请务必把上述(1)从脚本开始运行到上述所打印出来的系统信息(2)出错时候的相关信息(3)脚本所生成的BlogsToWordpress.log文件,通过复制粘贴、截图、附件等方式
LINE 1600 : INFO       发送至admin(at)crifan.com或跟帖(下面有地址)回复,否则如果没有足够的错误相关信息,我就是想帮你解决问题,也没法帮啊!
LINE 1600 : INFO     2.如对此脚本使用有任何疑问,请输入-h参数以获得相应的参数说明。
LINE 1600 : INFO     3.关于本程序详细的使用说明和更多相关信息,请参考:
LINE 1600 : INFO       BlogsToWordPress:将百度空间(新版和旧版),网易163,新浪Sina,QQ空间,人人网,CSDN,搜狐Sohu,博客大巴Blogbus,天涯博客,点点轻博客等博客搬家到WordPress
LINE 1600 : INFO       https://www.crifan.com/crifan_released_all/website/python/blogstowordpress/
LINE 1600 : INFO     --------------------------------------------------------------------------------
LINE 1600 : INFO     Your process type of post is: Export post to WXR(WordPress eXtended Rss).
LINE 1575 : ERROR    Must designate the entry URL for the first blog item !
LINE 1575 : ERROR    Unknown Error !
Traceback (most recent call last):
  File "<string>", line 1931, in <module>
  File "<string>", line 1655, in main
SystemExit: 2
 
D:\tmp\tmp_dev_root\python\tutorial_summary\make_exe\pyinstaller-2.0\BlogsToWordpress\dist>

加上对应参数,再试试:

D:\tmp\tmp_dev_root\python\tutorial_summary\make_exe\pyinstaller-2.0\BlogsToWordpress\dist>BlogsToWordpress.exe -s http://againinput4.blog.163.com
Imported: crifanLib,    v2.4
Imported: BlogNetease,  v1.4
Imported: BlogBaidu,    v3.4
Imported: BlogSina,     v1.5
Imported: BlogQQ,       v1.8
Imported: BlogCsdn,     v1.1
Imported: BlogSohu,     v1.3
LINE 1600 : INFO     Current runtime info:
LINE 1600 : INFO     Paramenters       : ['D:\\tmp\\tmp_dev_root\\python\\tutorial_summary\\make_exe\\pyinstaller-2.0\\BlogsToWordpress\\dist\\BlogsToWordpress.exe', '-s', 'http://againinput4.blog.163
.com']
LINE 1600 : INFO     Python version    : sys.version_info(major=2, minor=7, micro=3, releaselevel='final', serial=0)
LINE 1600 : INFO     platform.machine()=AMD64
LINE 1600 : INFO     platform.node()=PC-CLI-1
LINE 1600 : INFO     platform.platform()=Windows-7-6.1.7601-SP1
LINE 1600 : INFO     platform.processor()=Intel64 Family 6 Model 42 Stepping 7, GenuineIntel
LINE 1600 : INFO     platform.python_build()=('default', 'Apr 10 2012 23:24:47')
LINE 1600 : INFO     platform.python_compiler()=MSC v.1500 64 bit (AMD64)
...

的确就是可以正常执行了。

剩下的,就是要拿到别的windows平台上,多测试测试,是否都正常。

14.接着打算再去试试,添加icon图标的事情。

参考官网的参数解释:

-r FILE[,TYPE[,NAME[,LANGUAGE]]], ?resource=FILE[,TYPE[,NAME[,LANGUAGE]]]
add/update resource of the given type, name and language from FILE to the final executable. FILE can be a data file or an exe/dll. For data files, atleast TYPE and NAME need to be specified, LANGUAGE defaults to 0 or may be specified as wildcard * to update all resources of the given TYPE and NAME. For exe/dll files, all resources from FILE will be added/updated to the final executable if TYPE, NAME and LANGUAGE are omitted or specified as wildcard *.Multiple resources are allowed, using this option multiple times.

去运行:

D:\tmp\tmp_dev_root\python\tutorial_summary\make_exe\pyinstaller-2.0>pyinstaller.py -F -p D:\tmp\tmp_dev_root\python\tutorial_summary\make_exe\BlogsToWordpress\libs;D:\tmp\tmp_dev_root\python\tutorial
_summary\make_exe\BlogsToWordpress\libs\crifan;D:\tmp\tmp_dev_root\python\tutorial_summary\make_exe\BlogsToWordpress\libs\crifan\blogModules;D:\tmp\tmp_dev_root\python\tutorial_summary\make_exe\BlogsT
oWordpress\libs\thirdparty;D:\tmp\tmp_dev_root\python\tutorial_summary\make_exe\BlogsToWordpress\libs\thirdparty\chardet; -i ..\BlogsToWordpress\BlogsToWordpress.ico ..\BlogsToWordpress\BlogsToWordpre
ss.py
18 INFO: wrote D:\tmp\tmp_dev_root\python\tutorial_summary\make_exe\pyinstaller-2.0\BlogsToWordpress\BlogsToWordpress.spec
34 INFO: Testing for ability to set icons, version resources...
37 INFO: ... resource update available
40 INFO: UPX is not available.
681 INFO: checking Analysis
696 INFO: checking PYZ
709 INFO: checking PKG
711 INFO: building because D:\tmp\tmp_dev_root\python\tutorial_summary\make_exe\pyinstaller-2.0\BlogsToWordpress\build\pyi.win32\BlogsToWordpress\BlogsToWordpress.exe.manifest changed
712 INFO: building PKG out00-PKG.pkg
2190 INFO: checking EXE
2192 INFO: building because icon changed
2192 INFO: building EXE from out00-EXE.toc
2207 INFO: SRCPATH [('..\\BlogsToWordpress\\BlogsToWordpress.ico', None)]
2207 INFO: Updating icons from ['..\\BlogsToWordpress\\BlogsToWordpress.ico'] to c:\users\cli\appdata\local\temp\tmpouutgx
2209 INFO: Writing RT_GROUP_ICON 0 resource with 34 bytes
2211 INFO: Writing RT_ICON 1 resource with 1128 bytes
2213 INFO: Writing RT_ICON 2 resource with 4264 bytes
2222 INFO: Appending archive to EXE D:\tmp\tmp_dev_root\python\tutorial_summary\make_exe\pyinstaller-2.0\BlogsToWordpress\dist\BlogsToWordpress.exe

可以看到,其自动会把icon添加到当前已有的exe中,然后可以看到对应的,带图标的exe的效果:

用PyInstaller把Python代码打包成单个独立的exe可执行文件

总结

PyInstaller,的确非常好用啊。感谢作者们。

简单总结其使用方法:

生成单一的exe文件:

pyinstaller.py -F ..\BlogsToWordpress\BlogsToWordpress.py

添加必要的搜索路径:

pyinstaller.py -F -p D:\tmp\tmp_dev_root\python\tutorial_summary\make_exe\BlogsToWordpress\libs;D:\tmp\tmp_dev_root\python\tutorial_summary\make_exe\BlogsToWordpress\libs\crifan;D:\tmp\tmp_dev_root\python\tutorial_summary\make_exe\BlogsToWordpress\libs\crifan\blogModules;D:\tmp\tmp_dev_root\python\tutorial_summary\make_exe\BlogsToWordpress\libs\thirdparty;D:\tmp\tmp_dev_root\python\tutorial_summary\make_exe\BlogsToWordpress\libs\thirdparty\chardet; ..\BlogsToWordpress\BlogsToWordpress.py

添加必要的搜索路径,且带图标:

pyinstaller.py -F -p D:\tmp\tmp_dev_root\python\tutorial_summary\make_exe\BlogsToWordpress\libs;D:\tmp\tmp_dev_root\python\tutorial_summary\make_exe\BlogsToWordpress\libs\crifan;D:\tmp\tmp_dev_root\python\tutorial_summary\make_exe\BlogsToWordpress\libs\crifan\blogModules;D:\tmp\tmp_dev_root\python\tutorial_summary\make_exe\BlogsToWordpress\libs\thirdparty;D:\tmp\tmp_dev_root\python\tutorial_summary\make_exe\BlogsToWordpress\libs\thirdparty\chardet; -i ..\BlogsToWordpress\BlogsToWordpress.ico ..\BlogsToWordpress\BlogsToWordpress.py

需要注意的是:

1.检查生成的

pyinstaller-2.0\XXX\build\pyi.win32\XXX\warnXXX.txt

(XXX是你的项目名)

中,是否缺少了必要的模块。

如果有缺少的,那么去如上所述,添加必要的搜素路径,使得pyinstaller在运行时,可以找到对应的模块并集成进来。

2.此处我这里没有UPX,暂时没去折腾。

估计是用UPX去压缩,压缩后所生成的exe文件的大小,会小得多。

Python 相关文章推荐
用Python制作在地图上模拟瘟疫扩散的Gif图
Mar 31 Python
Python中对象迭代与反迭代的技巧总结
Sep 17 Python
Python科学计算之Pandas详解
Jan 15 Python
python中requests库session对象的妙用详解
Oct 30 Python
Flask-Mail用法实例分析
Jul 21 Python
Python的条件表达式和lambda表达式实例
Jan 31 Python
Python3 修改默认环境的方法
Feb 16 Python
Flask配置Cors跨域的实现
Jul 12 Python
Python3进制之间的转换代码实例
Aug 24 Python
python实现的多任务版udp聊天器功能案例
Nov 13 Python
通过实例解析python描述符原理作用
Jan 22 Python
python 实现单例模式的5种方法
Sep 23 Python
使用PyInstaller将python转成可执行文件exe笔记
May 26 #Python
Python带动态参数功能的sqlite工具类
May 26 #Python
通过Py2exe将自己的python程序打包成.exe/.app的方法
May 26 #Python
python学习笔记--将python源文件打包成exe文件(pyinstaller)
May 26 #Python
Python多重继承的方法解析执行顺序实例分析
May 26 #Python
Python多继承顺序实例分析
May 26 #Python
Python装饰器用法实例总结
May 26 #Python
You might like
php 上传功能实例代码
2010/04/13 PHP
解决php使用异步调用获取数据时出现(错误c00ce56e导致此项操作无法完成)
2013/07/03 PHP
PHP命名空间简单用法示例
2018/12/28 PHP
javascript权威指南 学习笔记之变量作用域分享
2011/09/28 Javascript
JavaScript验证18位身份证号码最后一位正确性的实现代码
2014/08/07 Javascript
浅谈javascript对象模型和function对象
2014/12/26 Javascript
基于JS代码实现当鼠标悬停表格上显示这一格的全部内容
2016/06/12 Javascript
Angularjs结合Bootstrap制作的一个TODO List
2016/08/18 Javascript
微信JS-SDK选取手机照片上传功能
2017/04/21 Javascript
jquery一键控制checkbox全选、反选或全不选
2017/10/16 jQuery
Vue-router 中hash模式和history模式的区别
2018/07/24 Javascript
Vue获取页面元素的相对位置的方法示例
2020/02/05 Javascript
JS相册图片抖动放大展示效果的示例代码
2021/01/29 Javascript
Python使用getpass库读取密码的示例
2017/10/10 Python
python中map的基本用法示例
2018/09/10 Python
Python3 执行系统命令并获取实时回显功能
2019/07/09 Python
Python画图高斯分布的示例
2019/07/10 Python
python递归法实现简易连连看小游戏
2020/03/25 Python
在Pycharm中调试Django项目程序的操作方法
2019/07/17 Python
Windows10下Tensorflow2.0 安装及环境配置教程(图文)
2019/11/21 Python
python带参数打包exe及调用方式
2019/12/21 Python
让ie浏览器成为支持html5的浏览器的解决方法(使用html5shiv)
2014/04/08 HTML / CSS
linux面试题参考答案(5)
2016/11/05 面试题
环境工程大学生个人的自我评价
2013/10/08 职场文书
英语文学专业学生的自我评价
2013/10/31 职场文书
婚前协议书怎么写
2014/04/15 职场文书
比赛口号大全
2014/06/10 职场文书
安全演讲稿开场白
2014/08/25 职场文书
2014四风问题对照检查材料范文
2014/09/15 职场文书
个人职业及收入证明
2014/10/13 职场文书
解除劳动关系协议书2篇
2014/11/28 职场文书
大学教师个人总结
2015/02/10 职场文书
2016年六一儿童节开幕词
2016/03/04 职场文书
python自动化八大定位元素讲解
2021/07/09 Python
oracle设置密码复杂度及设置超时退出的功能
2022/06/28 Oracle
微软Win11 全新照片应用面向 Dev预览版推出 新版本上手体验图集
2022/09/23 数码科技