首页 > 编程语言 >pyinstaller使用-python项目转换成exe可执行文件

pyinstaller使用-python项目转换成exe可执行文件

时间:2023-07-20 18:37:05浏览次数:54  
标签:文件 exe pyinstaller python -- file

http://blog.csdn.net/pipisorry/article/details/50620122

Python不是每个人的计算机里面都有安装,当您写了一个好用的工具,需要一个standalone exectuable环境的需求。并且用python写些脚本什么的,有时候脚本写完以后,每次运行都得在IDE打开在运行,很麻烦,所以经常将python编译成exe。

本文介绍如何将一个python项目(或者简单一点一个python脚本文件)转化为windows下的可执行文件。

转化要使用python转换为exe可执行文件的库,一个是py2exe,另外一个就是PyInstaller

py2exe:

打包好的exe只能在相同的系统下运行,比如你在XP系统用py2exe打包好的exe只能在XP上运行,在win7上肯定有问题,而且也是存在在别的XP机子上也可能不能运行,因为一些别的机子可能会缺少dll文件;

打包的文件也需要打包同exe下的dll,和一些库的压缩包,不然exe根本跑不起来

还需要另外的其他库文件配置。
PyInstaller:
可以只是生成单独的可执行程序
且支持的版本也多:2.3到2.7都支持。以及x64也支持
也可以自定义图标

本文介绍pyinstaller的使用。


安装pyinstaller

pyinstaller支持python2和python3

命令行安装:pip install pyinstaller

或者去下载安装:PyInstaller 3.1 (tar.gz) | http://sourceforge.net/projects/pywin32/files/pywin32/Build%20217/
Note: windows下转换要先安装pywin32:  pip install pywin32[pywin32的安装]
皮皮blog


pyinstaller的使用

命令行中转换py文件为exe文件

pi@PIPI /e/mine/python_workspace/nlp(dev)

$pyinstaller -F E:/mine/python_workspace/NLP/TargetOpinion/TargetOpinionMain.py
在命令行当前路径/e/mine/python_workspace/nlp中会生成

dist目录(目录里面有可执行文件)

build目录(生成exe的中间文件)

spec文件(要转换文件的同一目录下,用于生成exe文件,可以修改来自定义生成exe的属性)


指定dist生成目录路径(而不是命令行当前目录)

pyinstaller -F E:/mine/python_workspace/test0/testMain.py --distpath=E:/mine/python_workspace/test0/dist

压缩生成的exe文件

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

--upx        I mentioned that this is a great option, and it is, but it's really slow, especially as your source file gets bigger.  It's a great option for your final compile before distributing, but you might save a lot of time if you turn it off until then.

先下载http://upx.sourceforge.net/解压到要转换到的py文件目录下

pyinstaller参数中添加upx路径

pyinstaller -F E:/mine/python_workspace/NLP/TargetOpinion/TargetOpinionMain.py--upx-dir upx391w

[http://pythonhosted.org/PyInstaller/#using-upx]

直接进入界面程序

pyinstaller生成的exe文件是从命令行开始执行的,如果之前的程序是界面程序(如pyqt界面开始执行的),则要改成从界面执行,这样就不会看到命令行输出了(如bug错误输出、print输出等)

pyinstaller -Fw E:/mine/python_workspace/NLP/TargetOpinion/TargetOpinionMain.py

当然,如果是在调试期间,建议不要加w参数,这样就可以从命令行看到bug提示了。

修改中间文件spec文件生成自定义exe文件

修改中间文件,再去生成exe文件

如,在生成exe文件的同时,在exe目录下(dist目录)生成一个数据文件,相当于将python项目中的数据文件拷贝到dist目录

修改spec文件中datas如下:datas= [ ('nlptest/patternFile.txt', '.' ) ],

pyinstaller -F E:/mine/python_workspace/test0/testMain.spec

[http://pythonhosted.org/PyInstaller/#using-spec-files]

一步一步生成

当然也可以一步一步生成,并使用中间文件

生成中间文件:python Makespec.py --console --onefile NotePad\notepad.py

再build生成exe文件:python Build.py NotePad\notepad.spec

[关于python打包成exe的一点经验之谈]

[.py程序转换成.exe可执行程序]

py代码调用pyinstaller,将.py文件转换成exe文件(推荐)

当然也可以在TargetOpinionMain.py同目录下创建一个转换文件TargetPy2exe.py:

#!/usr/bin/env python
# -*- coding: utf-8 -*-
"""
__title__ = '将TargetOpinionMain python项目转换为exe文件'
__author__ = '皮'
__email__ = '[email protected]'
"""
from PyInstaller.__main__ import run

if name == 'main':
opts = ['TargetOpinionMain.py', '-F']
# opts = ['TargetOpinionMain.py', '-F', '-w']
# opts = ['TargetOpinionMain.py', '-F', '-w', '--icon=TargetOpinionMain.ico','--upx-dir','upx391w']
run(opts)

效果同命令行执行是一样的,只不过使用IDE执行这个转换代码,出错的话会有出错栈提示,可以很快到达出错位置;并且生成的build、dist目录就在本目录下,不用担心在命令行中执行目录错乱,找不到或者搞混dist目录。

pyinstaller生成exe文件后,数据文件读取路径的改变

python项目中读取文件会出错,其原因是读取的文件路径不是原来的了,因为所有文件都编译了,成了一个文件exe文件。

文件目录的改变可参考:[pyinstaller 生成单一的EXE文件之后获取当前目录的方法]

如果pythony代码中有读取文件操作,解决方案见:[pyinstaller相关错误]

皮皮blog



附录

pyinstaller参数

General Options

-h, --help show this help message and exit
-v, --version Show program version info and exit.
--distpath DIR Where to put the bundled app (default: ./dist)
--workpath WORKPATH
  Where to put all the temporary work files, .log, .pyz and etc. (default: ./build)
-y, --noconfirm
  Replace output directory (default: SPECPATH/dist/SPECNAME) without asking for confirmation
--upx-dir UPX_DIR
  Path to UPX utility (default: search the execution path)
-a, --ascii Do not include unicode encoding support (default: included if available)
--clean Clean PyInstaller cache and remove temporary files before building.
--log-level LEVEL
  Amount of detail in build-time console messages. LEVEL may be one of DEBUG, INFO, WARN, ERROR, CRITICAL (default: INFO).

What to generate

-D, --onedir Create a one-folder bundle containing an executable (default)
-F, --onefile Create a one-file bundled executable.
--specpath DIR Folder to store the generated spec file (default: current directory)
-n NAME, --name NAME
  Name to assign to the bundled app and spec file (default: first script's basename)

What to bundle, where to search

-p DIR, --paths DIR
  A path to search for imports (like using PYTHONPATH). Multiple paths are allowed, separated by ':', or use this option multiple times
--hidden-import MODULENAME, --hiddenimport MODULENAME
  Name an import not visible in the code of the script(s). This option can be used multiple times.
--additional-hooks-dir HOOKSPATH
  An additional path to search for hooks. This option can be used multiple times.
--runtime-hook RUNTIME_HOOKS
  Path to a custom runtime hook file. A runtime hook is code that is bundled with the executable and is executed before any other code or module to set up special features of the runtime environment. This option can be used multiple times.
--exclude-module EXCLUDES
  Optional module or package (his Python names, not path names) that will be ignored (as though it was not found). This option can be used multiple times.
--key KEY The key used to encrypt Python bytecode.

How to generate

-d, --debug Tell the bootloader to issue progress messages while initializing and starting the bundled app. Used to diagnose problems with missing imports.
-s, --strip Apply a symbol-table strip to the executable and shared libs (not recommended for Windows)
--noupx Do not use UPX even if it is available (works differently between Windows and *nix)

Windows and Mac OS X specific options

-c, --console, --nowindowed
  Open a console window for standard i/o (default)
-w, --windowed, --noconsole
  Windows and Mac OS X: do not provide a console window for standard i/o. On Mac OS X this also triggers building an OS X .app bundle. This option is ignored in *NIX systems.
-i <FILE.ico or FILE.exe,ID or FILE.icns>, --icon <FILE.ico or FILE.exe,ID or FILE.icns>
  FILE.ico: apply that icon to a Windows executable. FILE.exe,ID, extract the icon with ID from an exe. FILE.icns: apply the icon to the .app bundle on Mac OS X

Windows specific options

--version-file FILE
  add a version resource from FILE to the exe
-m <FILE or XML>, --manifest <FILE or XML>
  add manifest FILE or XML to the exe
-r RESOURCE, --resource RESOURCE
  Add or update a resource to a Windows executable. The RESOURCE is one to four items, FILE[,TYPE[,NAME[,LANGUAGE]]]. FILE can be a data file or an exe/dll. For data files, at least TYPE and NAME must 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 *.This option can be used multiple times.
--uac-admin Using this option creates a Manifest which will request elevation upon application restart.
--uac-uiaccess Using this option allows an elevated application to work with Remote Desktop.

Windows Side-by-side Assembly searching options (advanced)

--win-private-assemblies
  Any Shared Assemblies bundled into the application will be changed into Private Assemblies. This means the exact versions of these assemblies will always be used, and any newer versions installed on user machines at the system level will be ignored.
--win-no-prefer-redirects
  While searching for Shared or Private Assemblies to bundle into the application, PyInstaller will prefer not to follow policies that redirect to newer versions, and will try to bundle the exact versions of the assembly.

Mac OS X specific options

--osx-bundle-identifier BUNDLE_IDENTIFIER
  Mac OS X .app bundle identifier is used as the default unique program name for code signing purposes. The usual form is a hierarchical name in reverse DNS notation. For example: com.mycompany.department.appname (default: first script's basename)

Shortening the Command

Because of its numerous options, a full pyinstaller command can become very long. You will run the same command again and again as you develop your script. You can put the command in a shell script or batch file, using line continuations to make it readable. For example, in Linux:

pyinstaller --noconfirm --log-level=WARN \
    --onefile --nowindow \
    --hidden-import=secret1 \
    --hidden-import=secret2 \
    --upx-dir=/usr/local/share/ \
    myscript.spec

Or in Windows, use the little-known BAT file line continuation:

pyinstaller --noconfirm --log-level=WARN ^
    --onefile --nowindow ^
    --hidden-import=secret1 ^
    --hidden-import=secret2 ^
    --icon-file=..\MLNMFLCN.ICO ^
    myscript.spec

[http://pythonhosted.org/PyInstaller/#options]

pyinstaller-2.0 参数(翻译)

QQ截图20130403234716.png

Note:--onefile前面是两个-。

-F    制作独立的可执行程序
-D    制作出的档案存放在同一个文件夹下(默认值)
-K    包含TCL/TK(对于使用了TK的,最好加上这个选项,否则在未安装TK的电脑上无法运行)
-w     制作窗口程序
-c    制作命令行程序(默认)
-X    制作使用UPX压缩过的可执行程序(推荐使用这个选项,需要下载UPX包,解压后upx.exe放在Python(非PyInstaller)安装目录下,下载upx308w.zip)
-o DIR  指定输出SPEC文件路径(这也决定了最后输出的exe文件路径)
--icon=[ICO文件路径] 指定程序图标
-v [指定文件] 指定程序版本信息
-n [指定程序名] 指定程序名称

pyinstaller生成的exe文件执行过程

单独生成一个exe文件(-F参数)后,exe文件是怎么运行的:

How the One-File Program Works
The bootloader is the heart of the one-file bundle also. When started it creates a temporary folder in the appropriate temp-folder location for this OS. The folder is named _MEIxxxxxx, where xxxxxx is a random number.
The one executable file contains an embedded archive of all the Python modules used by your script, as well as compressed copies of any non-Python support files (e.g. .so files). The bootloader uncompresses the support files and writes copies into the the temporary folder. This can take a little time. That is why a one-file app is a little slower to start than a one-folder app.
After creating the temporary folder, the bootloader proceeds exactly as for the one-folder bundle, in the context of the temporary folder. When the bundled code terminates, the bootloader deletes the temporary folder.

[http://pythonhosted.org/PyInstaller/#how-the-one-file-program-works]

What happens during execution of bootloader:

  1. First process: bootloader starts.

    1. If one-file mode, extract bundled files to temppath_MEIxxxxxx
    2. Set/unset various environment variables, e.g. override LD_LIBRARY_PATH on Linux or LIBPATH on AIX; unset DYLD_LIBRARY_PATH on OSX.
    3. Set up to handle signals for both processes.
    4. Run the child process.
    5. Wait for the child process to finish.
    6. If one-file mode, delete temppath_MEIxxxxxx.注意,exe文件运行完成后,temp目录下的临时文件_mei***就会被删除。
  2. Second process: bootloader itself started as a child process.

    1. On Windows set the activation context.
    2. Load the Python dynamic library. The name of the dynamic library is embedded in the executable file.
    3. Initialize Python interpreter: set sys.path, sys.prefix, sys.executable.
    4. Run python code.

Running Python code requires several steps:

  1. Run the Python initialization code which prepares everything for running the user's main script. The initialization code can use only the Python built-in modules because the general import mechanism is not yet available. It sets up the Python import mechanism to load modules only from archives embedded in the executable. It also adds the attributes frozen and _MEIPASS to the sys built-in module.
  2. Execute any run-time hooks: first those specified by the user, then any standard ones.
  3. Install python "egg" files. When a module is part of a zip file (.egg), it has been bundled into the ./eggs directory. Installing means appending .egg file names to sys.path. Python automatically detects whether an item in sys.path is a zip file or a directory.
  4. Run the main script.

[http://pythonhosted.org/PyInstaller/#bootloader]

py2exe使用参考

[http://www.py2exe.org/index.cgi/Tutorial]

from:http://blog.csdn.net/pipisorry/article/details/50620122

ref:Simple guide to using PyInstaller

PyInstaller Manual*


标签:文件,exe,pyinstaller,python,--,file
From: https://www.cnblogs.com/SymPny/p/17569325.html

相关文章

  • windows64位配置安装python2.7
    1、下载python安装包在python官网进行下载https://www.python.org/downloads/ 我这里下载的是2.7.9的,当然你也可以下载最新的: 安装比较简单,只需要下一步...就行。2、添加Python的系统路径在“系统变量”中的“系统变量”里面的path中,添加你的pytho......
  • python监控磁盘使用率
    #!/usr/bin/envpython#-*-coding:utf-8-*-#@Time:2023/6/2713:56#@Author:zk_linux#@File:Disk_monitoring.py.py#@Software:PyCharmfromtempimportail_the_alarmimportpsutilimportosthreshold_value=75os.path.dirname(os.path......
  • [ACTF2020 新生赛]Exec
    [ACTF2020新生赛]Exec题目来源:buuctf题目类型:web涉及考点:目录遍历1.题目直接给了一个输入框,ping一下127.0.0.1看看接着查看目录,直接127.0.0.1;ls:只有index.php,我们先看看:127.0.0.1;catindex.php发现还是这个输入页面,没别的东西了,我们接下来目录遍历去找flag2.逐步......
  • python_500个长尾词
    pythonpython怎么读python编程python能做什么python下载python代码大全python语言属于什么语言python123python线下培训班python什么东西python官网python培训python入门python学习网站python安装python游戏代码python入门代码python游戏开发python爬虫python手机版python编译器py......
  • 请问为什么cmd中输入python显示no python at (python所在地址)?
    可能是由于您的Python安装路径不在系统的PATH环境变量中导致的。您可以尝试将Python的安装路径添加到PATH环境变量中,然后再次尝试在cmd中输入python。如果您已经将Python的安装路径添加到了PATH环境变量中,但仍然无法在cmd中输入python,那么可能是因为您的系统中存在多个版本的Pyt......
  • exclude在python中
    Python中的exclude用法作为一名经验丰富的开发者,我将教会你如何在Python中使用"exclude"函数。首先,让我们了解一下整个过程的流程,并在下面的表格中列出每个步骤。步骤描述1导入所需的库2定义一个包含要排除元素的列表3使用列表推导式或filter()函数来排除元素......
  • ile "D:\Development\Python\Python39\Scripts\pip3.exe\__main__.py", line 4,
    Python中的pip命令及其用法在Python中,pip是一个非常重要的工具,它是PythonPackageIndex(简称PyPI)上的软件包管理系统。通过使用pip,我们可以方便地安装、升级和卸载Python的第三方库。安装pip在大多数情况下,新版本的Python已经预装了pip。然而,如果你的Python没有安装pip,你可以通......
  • python安装问题
    --使用pipinstall命令安装插件时出现如下提示:(命令python-mpipinstall-ihttps://pypi.tuna.tsinghua.edu.cn/simplegitlab==1.0.2)(环境:Windows10)UnicodeDecodeError:'gbk'codeccan'tdecodebyte0xa2inposition202:illegalmultibytesequence[e......
  • 08python离线安装requests需要安装的依赖库
    requests安装有依赖的包版本,如下:certifi[required:>=2017.4.17]#CA认证模块urllib3[required:!=1.25.0,!=1.25.1,<1.26,>=1.21.1’]#线程安全HTTP库idna[required:<2.9,>=2.5]#国际化域名解析模块chardet[required:❤️.1.0,>=3.0.2]#通用字符编码检测器模块......
  • python模块缺少报错
     [root@localhostpythonProject1]#python-mpipinstall--upgradepip/usr/bin/python:Nomodulenamedpip[root@localhostpythonProject1]#python3-mpipinstall--upgradepippython3-mpipinstallnumpy ......