当前位置: 首页 > 知识库问答 >
问题:

如何创建最小大小的可执行文件与pyInster?

洪飞白
2023-03-14

我在Windows 10,我有anaconda安装,但我想创建一个独立的可执行文件在一个新的,干净的最小环境使用python 3.5.所以我做了一些测试:

我创建了一个python脚本test1.py在文件夹testenv只有:

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

它创造了我大约6Mb的test1.exe

测试2:我修改了测试1。具体如下:

import pandas as pd
print('Hello World')  

我在环境中安装了pandas并创建了新的可执行文件:

(venv_test) D:\testenv>pip install pandas
(venv_test) D:\testenv>pyinstaller --clean -F test1.py

蚂蚁它创建我的test1.exe现在是230 Mb!!!

如果我运行命令

(venv_test) D:\testenv>python -V
Python 3.5.2 :: Anaconda custom (64-bit)

当我运行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

我知道有一些相关的问题:减少pyinstaller exe的大小,使用pyinstaller和numpy减小可执行文件的大小,但我无法解决这个问题,我担心我在anaconda方面做了一些错误的事情。

所以我的问题是:我做错了什么?我可以减少我的可执行文件的大小吗?

共有3个答案

翁阳曜
2023-03-14

我有一个类似的问题,并找到了解决办法。

我使用Windows终端预览。这个程序允许创建各种虚拟环境,如Windows Power Shell(顺便说一下LinuxUbuntu。此外,值得注意的是:你可以在这个程序中安装许多终端,甚至一次打开几个。非常酷的东西)。

在Windows终端预览的Windows Power Shell中,我安装了所有必要的库(如numpy、pandas、re等),然后打开文件路径并尝试使用以下命令:

PyInster--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/但在我看来,这个图书馆很难,至少对我来说是这样。

汪兴旺
2023-03-14

问题是您不应该使用虚拟环境,尤其是anaconda。请下载默认的python 32位,并仅使用必要的模块。然后按照链接中提供的步骤进行操作,这肯定会解决问题。

尽管您创建了虚拟环境,但您确定您的等级库文件没有链接到旧的Anaconda条目吗?

如果所有这些都失败了,那么提交一个bug,因为这很奇怪。

澹台俊晖
2023-03-14

我接受了上面的答案,但我在这里发布了我为像我这样容易迷路的完全初学者一步一步做的事情。

在开始之前,我发布了完整的测试1。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。未定义显示时,使用('Agg')(因为我的实际代码正在创建图形)使用matplotlib生成PNG

下载python从:https://www.python.org/downloads/安装选择'添加python路径'和取消选择安装启动器为所有用户(我没有管理员权限)检查我使用相同的版本从CMD,只是写python我得到:Python 3.6.4(v3.6.4: d48eceb, Dec19 2017, 06:04:45)[MSC v.1900 32位(Intel)]on win32输入帮助、版权、信用或许可以获取更多信息。

D:\> mkdir py36envtest
...
D:\py36envtest>python -m venv venv_py36
...
D:\py36envtest\venv_py36\Scripts>activate.bat

使用以下命令确保它们与python版本兼容:(在python中导入时,从Matplotlib不被识别为模块)

(venv_py36) D:\py36envtest> python -m pip install nameofmodule

注:在我的例子中,我还必须添加选项-代理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

最初,我遇到了很多ImportError:DLL加载失败(特别是对于scipy)和丢失模块错误,我通过以下帖子解决了这些错误:
建议使用什么方法持久化(pickle)自定义sklearn管道
以及对此答案的评论:带有scipy的Pyinstaller。信号导入错误:DLL加载失败

我的输入1。规范最终看起来是这样的:

# -*- 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 )
(venv_py36) D:\py36envtest>pyinstaller -F --clean inputtest1.spec

我的测试1。exe为47.6MB。从anaconda虚拟环境创建的同一脚本的exe为229MB。

我很高兴(如果有更多建议,欢迎提出)

 类似资料:
  • 问题内容: 我在Windows 10上,安装了anaconda,但我想使用python 3.5在新的,干净的最小环境中独立创建可执行文件。所以我做了一些测试: TEST1:我在文件夹testenv中仅创建了一个python脚本test1.py: 然后创建环境,安装pyinstaller并创建可执行文件 它创建了大约6 Mb的我的test1.exe 测试2:我将test1.py修改如下: 我在环境中

  • 问题内容: 我只有一行用python编写的代码,并带有pyinstaller和option 。exe文件为4577 kB,几乎是5Mb。如何减小其大小或排除某些自动捆绑的图书馆? 问题答案: 您使用pyinstaller创建的.exe文件包括python解释器和脚本中包含的所有模块。也许您正在使用的模块本身都有一个很大的库。但是,您可以尝试使用 py2exe, 但它可能不适用于所有项目。另一种缩小

  • 问题内容: 我需要在Java中编写一个算法(对于android应用程序)来读取包含更多文件夹的文件夹,以及每个包含图像和音频文件的文件夹,因此结构如下: 我的问题是我需要将档案的大小限制为16mb,并且在运行时,根据需要创建尽可能多的档案,以包含主文件夹中的所有文件。 我从网上尝试了几个示例,并阅读了Java文档,但是我无法理解并按照需要的方式将它们放在一起。有人以前做过这个吗,或者有一个链接或一

  • 问题内容: 出于测试目的,我必须生成一定大小的文件(以测试上传限制)。 在Linux上创建一定大小的文件的命令是什么? 问题答案: 测试文件的大小在哪里(以字节为单位)

  • 问题内容: 我用Python打开了一个8 MB的文件,因为我想批量更改各种类型的文件名。我仔细检查并将文件加载到字符串中,然后使用字符串方法replace替换了所有内容。然后我注意到只有一半的文件被替换了。好像Python没有完全打开文件。 我必须在Python的范围内发挥某种字符串大小限制或最大文件大小限制吗? 请参阅Python搜索中的代码并替换未正确替换的代码。 我已更改为建议的代码。缓冲区

  • 我正在使用JHipster开发基于Spring Boot和AngularJS的应用程序。我的问题是如何设置上传文件的最大大小? 如果我试图上传到大文件,我会在控制台中获得以下信息: 和状态为500的服务器响应。 怎么设置?