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

部署运行你感兴趣的模型镜像

http://blog.youkuaiyun.com/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__ = 'pipisorry@126.com'
"""
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)

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.youkuaiyun.com/pipisorry/article/details/50620122

ref:Simple guide to using PyInstaller

PyInstaller Manual*


您可能感兴趣的与本文相关的镜像

Python3.11

Python3.11

Conda
Python

Python 是一种高级、解释型、通用的编程语言,以其简洁易读的语法而闻名,适用于广泛的应用,包括Web开发、数据分析、人工智能和自动化脚本

<think>嗯,用户想知道怎么用PyInstallerPython项目打包成Windows上的exe文件。首先,我需要回忆一下PyInstaller的基本用法。记得PyInstaller是一个常用的工具,可以把Python脚本转换成独立的可执行文件,这样用户不需要安装Python环境就能运行程序。不过,用户可能对这个过程不太熟悉,所以得一步步解释清楚。 首先,应该告诉用户安装PyInstaller的方法。通常是用pip安装,所以需要写pip install pyinstaller。不过可能用户已经安装了,或者需要升级到最新版本,这时候可能需要建议他们用--upgrade选项。 接下来,打包的基本命令。最简单的例子是pyinstaller --onefile main.py,这样会生成单个exe文件。但用户可能有自己的项目结构,比如有多个文件或者依赖资源。这时候需要解释如何处理这些情况,比如使用--add-data选项来包含图片、数据文件等资源。另外,如果项目有隐藏的依赖,可能需要用--hidden-import来指定。 还有图标的问题,用户可能想给exe文件换个图标,这时候要用--icon参数,指定.ico文件。然后,生成的exe文件在dist目录下,需要提醒用户测试是否能在其他机器上运行。 另外,用户可能遇到路径问题,比如程序中用到了相对路径。这时候要提醒他们使用os.path.dirname(__file__)来获取当前脚本的路径,避免打包后路径错误。比如引用中的例子,用os.path.join来处理资源路径,这样打包后资源文件才能正确加载。 还有,可能需要提到一些常见问题,比如杀毒软件误报,或者打包后的文件大小较大。这时候可以建议使用--noconsole来隐藏命令行窗口,或者用UPX压缩来减小体积。 最后,生成相关问题的时候,要涵盖用户可能进一步想知道的内容,比如处理依赖库、路径问题、减小体积、跨平台打包等。这样用户如果有其他疑问,也能找到答案。 现在整理一下步骤,确保每个环节都清楚,并且引用相关的参考资料。比如在路径处理部分,可以引用用户提供的引用3中的例子,说明如何正确使用相对路径。这样回答会更可靠,用户也能参考到具体的例子。</think>### 分步指南:使用PyInstaller打包Python项目为Windows可执行文件 #### 1. **安装PyInstaller** 通过pip安装PyInstaller(需提前安装Python环境): ```bash pip install pyinstaller ``` 若需升级到最新版本: ```bash pip install --upgrade pyinstaller ``` #### 2. **基础打包命令** - **单文件打包**:将主程序`main.py`打包为单个`.exe`文件,生成到`dist`目录: ```bash pyinstaller --onefile main.py ``` 生成的`main.exe`路径为`./dist/main.exe`。 - **带图标的打包**:通过`--icon`指定`.ico`格式图标: ```bash pyinstaller --onefile --icon=app.ico main.py ``` #### 3. **处理复杂项目** - **添加数据文件**:若项目依赖图片、配置文件等资源,需使用`--add-data`参数,格式为`源路径:目标路径`: ```bash pyinstaller --onefile --add-data "assets/*.png;assets" main.py ``` 打包后资源文件会被复制到与可执行文件同级的`assets`目录下。 - **处理隐藏依赖**:某些动态导入的库需显式声明,例如`--hidden-import pandas`: ```bash pyinstaller --onefile --hidden-import pandas main.py ``` #### 4. **路径规范化** 在代码中**避免硬编码路径**,改用动态路径获取(参考引用[^3]): ```python import os # 获取当前脚本所在目录 base_dir = os.path.dirname(__file__) # 组合资源路径 icon_path = os.path.join(base_dir, "assets/icon.png") ``` #### 5. **测试与分发** - 在`dist`目录中找到生成的`.exe`文件,双击运行测试。 - 若需分发,需将`dist`目录整体压缩(包含所有依赖文件)。 --- ### 常见问题与优化 - **体积过大**:使用UPX压缩(需[下载UPX](https://upx.github.io/)并指定路径): ```bash pyinstaller --onefile --upx-dir=/path/to/upx main.py ``` - **隐藏控制台窗口**(适用于GUI程序): ```bash pyinstaller --noconsole --onefile main.py ``` --- ### 引用说明 - 关于路径规范化的实现方法参考了引用的动态路径处理示例。 - 打包工具的核心原理与Python环境依赖关系可参考引用[^1]和[^2]。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值