1

我正在尝试创建一个虚拟环境来限制我正在创建的 exe 文件的大小。但是,当我创建一个虚拟环境时,它似乎仍然添加了我没有在所述环境中安装的包。

我尝试在导入 numpy 的地方做一个非常小的测试文件:

import numpy as np
A = np.array([0,0,1])
print(A)

当我创建我的虚拟环境并从 cmd 运行脚本时,它会发现环境中没有安装 numpy,但是当我使用 pyinstaller 将测试脚本制作成 exe 文件时,无论如何它都会以某种方式将 numpy 混入其中......我在这里有我的整个 cmd 程序:

Microsoft Windows [Version 6.1.7601]
Copyright (c) 2009 Microsoft Corporation.  All rights reserved.

C:\Users\MRCH>Virtualenv test_env
Using base prefix 'c:\\anaconda3'
New python executable in C:\Users\MRCH\test_env\Scripts\python.exe
Installing setuptools, pip, wheel...done.

C:\Users\MRCH>test_env\scripts\activate

(test_env) C:\Users\MRCH\dist>pip list
Package    Version
---------- -------
pip        10.0.1
setuptools 39.2.0
wheel      0.31.1

(test_env) C:\Users\MRCH>python test.py
Traceback (most recent call last):
  File "test.py", line 1, in <module>
    import numpy as np
ModuleNotFoundError: No module named 'numpy'

(test_env) C:\Users\MRCH>pyinstaller test.py -y -F
454 INFO: PyInstaller: 3.3.1
...
132266 INFO: Appending archive to EXE C:\Users\MRCH\dist\test.exe
132473 INFO: Building EXE from out00-EXE.toc completed successfully.

(test_env) C:\Users\MRCH>cd dist

(test_env) C:\Users\MRCH\dist>test.exe
[0 0 1]

(test_env) C:\Users\MRCH\dist>

我究竟做错了什么?

4

2 回答 2

1

pyinstaller 文档pyinstaller 分析导入语句以收集依赖项。

您的问题似乎来自 pyinstaller 在 anaconda 目录中查找软件包。您需要像这样明确排除软件包:

pyinstaller test.py -y -F --exclude numpy

或像this answer建议的那样创建一个与anaconda分开的新虚拟环境。

于 2018-05-30T09:12:43.640 回答
0

这是解决方案的快速摘要。

1)虚拟环境中的Pyinstaller 我发现当我创建一个虚拟环境时,我要做的第一件事就是安装Pyinstaller。如果我不这样做,它会包含大量来自虚拟环境之外的包。(我不确定这是否真的发生了,但它确实解决了我的问题,所以如果有人对此有任何见解,请随时贡献)。

安装 Pyinstaller 后,我安装脚本所需的包。

在这种情况下,.exe 仍然很大,即使只使用了 numpy。

2) Anaconda VS clean Python 我安装了一个干净的Python 32bit并创建了一个独立于 Anaconda 的虚拟环境。这样,conda 环境中的许多包都被省略了,我设法将文件大小减小到原始大小的大约 1/10

UPX 当使用干净的 python 通过 UPX 压缩文件时,我遇到了很多ImportError: DLL load failed错误,我发现这是由于UPX造成的。在没有 UPX 的情况下运行 Pyinstaller 时,不会发生错误,一切运行顺利。

于 2018-05-31T10:13:49.470 回答