如何使用 pyinstaller 创建最小大小的可执行文件?
How can I create the minimum size executable with pyinstaller?
我在 Windows 10,我安装了 anaconda,但我想使用 python 3.5 在一个新的、干净的最小环境中独立创建一个可执行文件。所以我做了一些测试:
测试 1:
我在文件夹 testenv 中创建了一个 python 脚本 test1.py,只有:
print('Hello World')
然后我创建了环境,安装了pyinstaller并创建了可执行文件
D:\testenv> python -m venv venv_test
...
D:\testenv\venv_test\Scripts>activate.bat
...
(venv_test) D:\testenv>pip install pyinstaller
(venv_test) D:\testenv>pyinstaller --clean -F test1.py
它创建了我的 test1.exe 大约 6 Mb
测试 2:我修改 test1.py 如下:
import pandas as pd
print('Hello World')
我在环境中安装了pandas并创建了新的可执行文件:
(venv_test) D:\testenv>pip install pandas
(venv_test) D:\testenv>pyinstaller --clean -F test1.py
Ant 它创建了我的 test1.exe,现在是 230 Mb!!!
如果我运行命令
(venv_test) D:\testenv>python -V
Python 3.5.2 :: Anaconda custom (64-bit)
当我 运行ning pyinstaller 时,我收到一些我不理解的消息,例如:
INFO: site: retargeting to fake-dir 'c:\users\username\appdata\local\continuum\anaconda3\lib\site-packages\PyInstaller\fake-modules'
我还收到有关 matplotlib 和其他与我的代码无关的模块的消息,例如:
INFO: Matplotlib backend "pdf": added
INFO: Matplotlib backend "pgf": added
INFO: Matplotlib backend "ps": added
INFO: Matplotlib backend "svg": added
我知道有一些相关的问题:
,
但我无法解决问题,恐怕我在水蟒方面做错了。
所以我的问题是:
我究竟做错了什么?我可以减小可执行文件的大小吗?
问题是您不应该使用虚拟环境,尤其是 anaconda。请下载默认 python 32 位并仅使用必要的模块。然后按照链接中提供的步骤进行操作,这肯定会解决它。
虽然您创建了一个虚拟环境,但您确定您的规范文件没有链接到旧的 Anaconda 条目吗?
如果这一切都失败了,请提交一个错误,因为这很奇怪。
我接受了上面的答案,但我 post 在这里我是为像我这样容易迷路的完全初学者一步一步做的。
在我开始之前,我 post 我的完整 test1.py 示例脚本包含我实际需要的所有模块。如果它比原来的问题复杂一点,我深表歉意,但也许这可以帮助某人。
test1.py 看起来像这样:
import matplotlib
matplotlib.use('Agg')
import matplotlib.pyplot as plt
import matplotlib.image as image
import numpy as np
import os.path
import pandas as pd
import re
from matplotlib.ticker import AutoMinorLocator
from netCDF4 import Dataset
from time import time
from scipy.spatial import distance
from simpledbf import Dbf5
from sys import argv
print('Hello World')
我添加了 matplotlib.use('Agg')(因为我的实际代码是创建数字)
Generating a PNG with matplotlib when DISPLAY is undefined
1) 安装独立于 anaconda 的新版本 python。
已从 python 下载:
https://www.python.org/downloads/
安装选择 'add python to path' 并取消选择为所有用户安装启动器(我没有管理员权限)
检查我使用的是来自 CMD 的相同版本,只写 python
我得到:
Python 3.6.4(v3.6.4:d48eceb,2017 年 12 月 19 日,06:04:45)Win32 上的 [MSC v.1900 32 位(英特尔)]
键入 "help"、"copyright"、"credits" 或 "license" 以获得更多信息。
2) 从 CMD
创建并激活环境
D:\> mkdir py36envtest
...
D:\py36envtest>python -m venv venv_py36
...
D:\py36envtest\venv_py36\Scripts>activate.bat
3) 在环境中安装脚本中需要的所有模块
使用以下命令确保它们与 python 版本兼容:
(来自 )
(venv_py36) D:\py36envtest> python -m pip install nameofmodule
注意:在我的例子中,我还必须添加选项 --proxy https://00.000.000.00:0000
例如我使用的是py安装程序的开发版本:
(venv_py36) D:\py36envtest> python -m pip install https://github.com/pyinstaller/pyinstaller/archive/develop.tar.gz
和模块:pandas、matplolib、simpledbf、scipy、netCDF4。最后我的环境看起来像这样。
(venv_py36) D:\py36envtest> pip freeze
altgraph==0.15
cycler==0.10.0
future==0.16.0
macholib==1.9
matplotlib==2.1.2
netCDF4==1.3.1
numpy==1.14.0
pandas==0.22.0
pefile==2017.11.5
PyInstaller==3.4.dev0+5f9190544
pyparsing==2.2.0
pypiwin32==220
python-dateutil==2.6.1
pytz==2017.3
scipy==1.0.0
simpledbf==0.2.6
six==1.11.0
style==1.1.0
update==0.0.1
4) Create/modify .spec 文件(当你 运行 pyinstaller 它创建一个 .spec 文件,你可以重命名)。
最初我遇到了很多 ImportError: DLL 加载失败(尤其是 scipy)和缺少模块错误,我解决了这些问题 posts:
以及对此答案的评论:
Pyinstaller with scipy.signal ImportError: DLL load failed
我的 inputtest1.spec 最后看起来像这样:
# -*- mode: python -*-
options = [ ('v', None, 'OPTION')]
block_cipher = None
a = Analysis(['test1.py'],
pathex=['D:\py36envtest', 'D:\py36envtest\venv_py36\Lib\site-packages\scipy\extra-dll' ],
binaries=[],
datas=[],
hiddenimports=['scipy._lib.messagestream',
'pandas._libs.tslibs.timedeltas'],
hookspath=[],
runtime_hooks=[],
excludes=[],
win_no_prefer_redirects=False,
win_private_assemblies=False,
cipher=block_cipher)
pyz = PYZ(a.pure, a.zipped_data,
cipher=block_cipher)
exe = EXE(pyz,
a.scripts,
a.binaries,
a.zipfiles,
a.datas,
name='test1',
debug=False,
strip=False,
upx=True,
runtime_tmpdir=None,
console=True )
5) 最后用命令生成可执行文件
(venv_py36) D:\py36envtest>pyinstaller -F --clean inputtest1.spec
my test1.exe 是 47.6 Mb,从 anaconda 虚拟环境创建的相同脚本的 .exe 是 229 Mb。
我很高兴(如果有更多的建议欢迎他们)
我遇到了类似的问题并找到了解决方案。
我使用了 Windows 终端预览。该程序允许创建各种虚拟环境,例如 Windows Power Shell(顺便说一句。Linux Ubuntu。另外,值得注意的是:您可以在该程序中安装许多终端,并且,甚至,一次打开几个。很酷的东西)。
Inside Windows Power Shell in Windows terminal preview 我安装了所有必要的库(如 numpy、pandas、re 等),然后我打开我文件的路径并尝试使用此命令:
pyinstaller --onefile -w 'filename.py'
...但是,输出 exe
无效。出于某种原因,控制台说缺少一个库(我之前安装过)。我找到了模仿 auto-py-to-exe
库的解决方案。此 GUI 使用的命令是:
pyinstaller --noconfirm --onedir --console "C:/Users/something/filename.py"
这个效果很好。 我将输出 exe 程序的大小从 911MB 减少到 82.9MB !!!
顺便说一句。 911MB 是 auto-py-to-exe
.
输出的大小
我想知道怎么可能还没有人创建一个压缩器来读取代码,检查哪些库是代码的一部分,然后只将它们放入压缩中。在我的例子中,auto-py-to-exe
可能加载了我安装过的所有库。这将解释这个压缩文件夹的大小。
有人建议使用 https://virtualenv.pypa.io/en/stable/ 但在我看来,这个库非常难,至少对我来说是这样。
我在 Windows 10,我安装了 anaconda,但我想使用 python 3.5 在一个新的、干净的最小环境中独立创建一个可执行文件。所以我做了一些测试:
测试 1: 我在文件夹 testenv 中创建了一个 python 脚本 test1.py,只有:
print('Hello World')
然后我创建了环境,安装了pyinstaller并创建了可执行文件
D:\testenv> python -m venv venv_test
...
D:\testenv\venv_test\Scripts>activate.bat
...
(venv_test) D:\testenv>pip install pyinstaller
(venv_test) D:\testenv>pyinstaller --clean -F test1.py
它创建了我的 test1.exe 大约 6 Mb
测试 2:我修改 test1.py 如下:
import pandas as pd
print('Hello World')
我在环境中安装了pandas并创建了新的可执行文件:
(venv_test) D:\testenv>pip install pandas
(venv_test) D:\testenv>pyinstaller --clean -F test1.py
Ant 它创建了我的 test1.exe,现在是 230 Mb!!!
如果我运行命令
(venv_test) D:\testenv>python -V
Python 3.5.2 :: Anaconda custom (64-bit)
当我 运行ning pyinstaller 时,我收到一些我不理解的消息,例如:
INFO: site: retargeting to fake-dir 'c:\users\username\appdata\local\continuum\anaconda3\lib\site-packages\PyInstaller\fake-modules'
我还收到有关 matplotlib 和其他与我的代码无关的模块的消息,例如:
INFO: Matplotlib backend "pdf": added
INFO: Matplotlib backend "pgf": added
INFO: Matplotlib backend "ps": added
INFO: Matplotlib backend "svg": added
我知道有一些相关的问题:
所以我的问题是: 我究竟做错了什么?我可以减小可执行文件的大小吗?
问题是您不应该使用虚拟环境,尤其是 anaconda。请下载默认 python 32 位并仅使用必要的模块。然后按照链接中提供的步骤进行操作,这肯定会解决它。
虽然您创建了一个虚拟环境,但您确定您的规范文件没有链接到旧的 Anaconda 条目吗?
如果这一切都失败了,请提交一个错误,因为这很奇怪。
我接受了上面的答案,但我 post 在这里我是为像我这样容易迷路的完全初学者一步一步做的。
在我开始之前,我 post 我的完整 test1.py 示例脚本包含我实际需要的所有模块。如果它比原来的问题复杂一点,我深表歉意,但也许这可以帮助某人。
test1.py 看起来像这样:
import matplotlib
matplotlib.use('Agg')
import matplotlib.pyplot as plt
import matplotlib.image as image
import numpy as np
import os.path
import pandas as pd
import re
from matplotlib.ticker import AutoMinorLocator
from netCDF4 import Dataset
from time import time
from scipy.spatial import distance
from simpledbf import Dbf5
from sys import argv
print('Hello World')
我添加了 matplotlib.use('Agg')(因为我的实际代码是创建数字) Generating a PNG with matplotlib when DISPLAY is undefined
1) 安装独立于 anaconda 的新版本 python。
已从 python 下载:
https://www.python.org/downloads/
安装选择 'add python to path' 并取消选择为所有用户安装启动器(我没有管理员权限)
检查我使用的是来自 CMD 的相同版本,只写 python
我得到:
Python 3.6.4(v3.6.4:d48eceb,2017 年 12 月 19 日,06:04:45)Win32 上的 [MSC v.1900 32 位(英特尔)]
键入 "help"、"copyright"、"credits" 或 "license" 以获得更多信息。
2) 从 CMD
创建并激活环境D:\> mkdir py36envtest
...
D:\py36envtest>python -m venv venv_py36
...
D:\py36envtest\venv_py36\Scripts>activate.bat
3) 在环境中安装脚本中需要的所有模块
使用以下命令确保它们与 python 版本兼容:
(来自
(venv_py36) D:\py36envtest> python -m pip install nameofmodule
注意:在我的例子中,我还必须添加选项 --proxy https://00.000.000.00:0000
例如我使用的是py安装程序的开发版本:
(venv_py36) D:\py36envtest> python -m pip install https://github.com/pyinstaller/pyinstaller/archive/develop.tar.gz
和模块:pandas、matplolib、simpledbf、scipy、netCDF4。最后我的环境看起来像这样。
(venv_py36) D:\py36envtest> pip freeze
altgraph==0.15
cycler==0.10.0
future==0.16.0
macholib==1.9
matplotlib==2.1.2
netCDF4==1.3.1
numpy==1.14.0
pandas==0.22.0
pefile==2017.11.5
PyInstaller==3.4.dev0+5f9190544
pyparsing==2.2.0
pypiwin32==220
python-dateutil==2.6.1
pytz==2017.3
scipy==1.0.0
simpledbf==0.2.6
six==1.11.0
style==1.1.0
update==0.0.1
4) Create/modify .spec 文件(当你 运行 pyinstaller 它创建一个 .spec 文件,你可以重命名)。
最初我遇到了很多 ImportError: DLL 加载失败(尤其是 scipy)和缺少模块错误,我解决了这些问题 posts:
以及对此答案的评论:
Pyinstaller with scipy.signal ImportError: DLL load failed
我的 inputtest1.spec 最后看起来像这样:
# -*- mode: python -*-
options = [ ('v', None, 'OPTION')]
block_cipher = None
a = Analysis(['test1.py'],
pathex=['D:\py36envtest', 'D:\py36envtest\venv_py36\Lib\site-packages\scipy\extra-dll' ],
binaries=[],
datas=[],
hiddenimports=['scipy._lib.messagestream',
'pandas._libs.tslibs.timedeltas'],
hookspath=[],
runtime_hooks=[],
excludes=[],
win_no_prefer_redirects=False,
win_private_assemblies=False,
cipher=block_cipher)
pyz = PYZ(a.pure, a.zipped_data,
cipher=block_cipher)
exe = EXE(pyz,
a.scripts,
a.binaries,
a.zipfiles,
a.datas,
name='test1',
debug=False,
strip=False,
upx=True,
runtime_tmpdir=None,
console=True )
5) 最后用命令生成可执行文件
(venv_py36) D:\py36envtest>pyinstaller -F --clean inputtest1.spec
my test1.exe 是 47.6 Mb,从 anaconda 虚拟环境创建的相同脚本的 .exe 是 229 Mb。
我很高兴(如果有更多的建议欢迎他们)
我遇到了类似的问题并找到了解决方案。
我使用了 Windows 终端预览。该程序允许创建各种虚拟环境,例如 Windows Power Shell(顺便说一句。Linux Ubuntu。另外,值得注意的是:您可以在该程序中安装许多终端,并且,甚至,一次打开几个。很酷的东西)。
Inside Windows Power Shell in Windows terminal preview 我安装了所有必要的库(如 numpy、pandas、re 等),然后我打开我文件的路径并尝试使用此命令:
pyinstaller --onefile -w 'filename.py'
...但是,输出 exe
无效。出于某种原因,控制台说缺少一个库(我之前安装过)。我找到了模仿 auto-py-to-exe
库的解决方案。此 GUI 使用的命令是:
pyinstaller --noconfirm --onedir --console "C:/Users/something/filename.py"
这个效果很好。 我将输出 exe 程序的大小从 911MB 减少到 82.9MB !!!
顺便说一句。 911MB 是 auto-py-to-exe
.
我想知道怎么可能还没有人创建一个压缩器来读取代码,检查哪些库是代码的一部分,然后只将它们放入压缩中。在我的例子中,auto-py-to-exe
可能加载了我安装过的所有库。这将解释这个压缩文件夹的大小。
有人建议使用 https://virtualenv.pypa.io/en/stable/ 但在我看来,这个库非常难,至少对我来说是这样。