将Python程序转换为Windows可执行文件(.exe)可以实现在没有Python环境的Windows计算机上运行程序。下面是一个完整的攻略。
1. 安装pyinstaller
pyinstaller是一个用于将Python程序转换为独立可执行文件的工具。使用pip可以轻松安装pyinstaller,只需在命令行中运行以下命令:
pip install pyinstaller
2. 创建spec文件
使用pyinstaller需要首先创建一个spec文件,该文件包含如何打包Python程序的详细说明。在命令行中,进入Python程序所在目录并运行以下命令:
pyinstaller --name=程序名称 --onefile 程序名称.py
--name
选项用于指定生成的可执行文件的名称。--onefile
选项用于生成单个可执行文件。
执行完上述命令后,会在当前目录下生成一个.spec文件,该文件包含打包Python程序的详细说明。
3. 修改spec文件
打开.spec文件,在其最后添加以下代码:
import os
import sys
from PyInstaller.utils.hooks import collect_data_files
basepath = os.path.abspath(os.path.dirname(__file__))
datas = collect_data_files("matplotlib")
for data in datas:
dirname, filename = os.path.split(data[1])
if dirname.startswith("matplotlib"):
dirname = os.path.join("_MEIPASS", "mpl-data", dirname)
else:
dirname = os.path.join("_MEIPASS", dirname)
datas.append((os.path.join(basepath, data[0]), os.path.join(dirname, filename)))
这段代码用于处理matplotlib库的问题。如果程序中用到了matplotlib库,就必须加入这段代码。
4. 执行打包命令
在命令行中,进入.spec文件所在目录,并执行以下命令:
pyinstaller --name=程序名称 --onefile 程序名称.spec
其中,--name
选项用于指定生成的可执行文件的名称,--onefile
选项用于生成单个可执行文件。
示例1:将hello.py转换为hello.exe
下面以将hello.py转换为hello.exe为示例,展示详细步骤。
-
首先在hello.py所在目录打开命令行窗口。
-
运行以下命令安装pyinstaller工具:
pip install pyinstaller
-
在命令行中运行以下命令,生成.spec文件:
pyinstaller --name=hello --onefile hello.py
-
打开.hello.spec文件,添加matplotlib库的处理代码,示例代码如下:
```python
import os
import sys
from PyInstaller.utils.hooks import collect_data_filesbasepath = os.path.abspath(os.path.dirname(file))
datas = collect_data_files("matplotlib")
for data in datas:
dirname, filename = os.path.split(data[1])
if dirname.startswith("matplotlib"):
dirname = os.path.join("_MEIPASS", "mpl-data", dirname)
else:
dirname = os.path.join("_MEIPASS", dirname)
datas.append((os.path.join(basepath, data[0]), os.path.join(dirname, filename)))
``` -
在命令行中运行以下命令,生成hello.exe文件:
pyinstaller --name=hello --onefile hello.spec
示例2:将包含GUI界面的Python程序转换为exe文件
以下示例将包含GUI界面的Python程序转换为exe文件。
-
首先在Python程序所在目录打开命令行窗口。
-
运行以下命令安装pyinstaller工具:
pip install pyinstaller
-
在命令行中运行以下命令,生成.spec文件:
pyinstaller --onefile 程序名称.py
-
在.spec文件中添加GUI相关代码,示例代码如下:
```python
import os
import sysif sys.platform == 'win32':
try:
import matplotlib
# Matplotlib fix for pyinstaller
MATPLOTLIBDATA = matplotlib.get_data_path()
mpl_data = os.path.join(os.path.split(MATPLOTLIBDATA)[0], 'share', 'matplotlib')
DATADIR = [
(os.path.join(mpl_data, 'mpl-data'), 'mpl-data'),
(os.path.join(mpl_data, 'matplotlibrc'), './')]
except ImportError:
print('Matplotlib not found, not adding to data files')
DATADIR = []
else:
DATADIR = []topology = 0
exe_path = sys.executable
test_path = os.path.dirname(os.path.abspath(file))
assets_path = os.path.join(test_path, "assets")
try:
import PySide2.QtCore
topology = 2
QT5VERSION = PySide2.QtCore.QT_VERSION_STR
QT5PLUGIN = PySide2.file
QT5FOLDER = os.path.normpath(os.path.join(QT5PLUGIN, "..", "plugins", "platforms"))CLASS_FILES = [ (os.path.join(test_path, "resources"), "resources"), ("assets", "assets") ] DATA_FILES = [ (QT5PLUGIN, "."), (os.path.join(QT5PLUGIN, "..", "Qt", "plugins", "platforms", "*"), "./platforms"), # 方便替换 ] # Rename the exe to a valid Python name that won't clash # This needs to be done because the PyInstaller spec file is in Python NEWEXENAME = "validexe.py" hidden_imports = ["pkg_resources.py2_warn"]
except ImportError:
pass(sources, target dir)
coll = []
for root, dirs, files in os.walk(os.path.join(test_path)):
for f in files:
if '.pyc' in f or '.pyo' in f:
continue
filename = os.path.join(root, f)
targetdir = os.path.join(os.path.relpath(root, test_path))
coll.append((filename, targetdir))a = Analysis(
[os.path.join(test_path, 'main.py')],
pathex=[test_path],
binaries=None,
datas=DATADIR + CLASS_FILES + coll + DATA_FILES,
hiddenimports=[
'pkg_resources.py2_warn'
],
hookspath=[],
runtime_hooks=[],
excludes=[
'numpy',
'PySide2',
],
win_no_prefer_redirects=False,
win_private_assemblies=True,
cipher=None,
bootstrap=(),
extra_pyz_stacks=[]
)pyz = PYZ(a.pure, a.zipped_data,
cipher=None)
exe = EXE(pyz,
a.scripts,
a.binaries,
a.zipfiles,
a.datas,
[],
name='validexe.py',
debug=False,
bootloader_ignore_signals=False,
strip=False,
upx=True,
upx_exclude=[],
upx_include=[],
console=False
)coll_f = COLLECT(exe,
a.binaries,
a.zipfiles,
a.datas,
[os.path.join(QT5FOLDER, "qwindows.dll"), (os.path.join(QT5FOLDER, "qminimal.dll")),
os.path.join(QT5FOLDER, "qoffscreen.dll")],
upx=True,
upx_exclude=[],
name='validexe.exe',
debug=False,
bootloader_ignore_signals=False,
strip=False,
upx_include=[],
console=False)os.system('rd /S /Q build')
app_folder = "build/exe.win-amd64-3.6"
shutil.copytree(os.path.join(assets_path), os.path.join(app_folder, "assets"))if topology == 2:
shutil.copytree(os.path.normpath(os.path.join(QT5PLUGIN, "..", "plugins", "platforms")), os.path.join(app_folder, "platforms"))
else:
print("Error - Unsupported topology")
sys.exit(-1)
``` -
在命令行中运行以下命令,生成程序名称.exe文件:
pyinstaller --onefile 程序名称.spec
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:详解将Python程序(.py)转换为Windows可执行文件(.exe) - Python技术站