Python 3虚拟环境 - 不存在的包

时间:2018-05-30 08:53:06

标签: python numpy pyinstaller virtual-environment

我试图创建一个虚拟环境来限制我正在创建的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>

我做错了什么?

2 个答案:

答案 0 :(得分:1)

pyinstaller docs pyinstaller分析import语句来收集依赖项。

看来您的问题来自于anaconda目录中的pyinstaller查找包。 您需要明确地排除这些包:

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

或创建一个与anaconda分开的新虚拟环境,如this answer所示。

答案 1 :(得分: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时,不会发生任何错误,一切都会顺利运行。