我已经安装了父模块,如何解决缺少的实用程序模块阻止我的可执行文件运行的问题?

时间:2019-07-02 21:14:22

标签: python scikit-learn pyinstaller executable

我已经编写了一些Python脚本来为机器学习算法过程创建tkinter GUI。我最初用PyCharm编写了所有代码,但我真的很想将所有内容放到一个独立的可执行文件中。我已经将主脚本及其.py依赖项移到了自己的目录中,并使用命令提示符对其进行了测试,并且效果很好。但是,当我运行pyinstaller时,可执行文件已创建,但启动时失败。

该程序由三个文件组成,其中GUI.py是主脚本。如上所述,我将相关文件移动到新目录中,并在命令提示符下测试了GUI.py,它运行良好。可执行文件已创建(尽管有很多有关丢失“ api-ms-win-crt”文件的警告),但无法运行。

我使用以下命令创建了可执行文件:

pyinstaller --onefile GUI.py

当可执行文件在创建后从命令行运行时,我得到了一条长而长的回溯,结尾是:

File "site-packages\sklearn\metrics\pairwise.py", line 32, in <module>
File "sklearn\metrics\pairwise_fast.pyx", line 1, in init 
    sklearn.metrics.pairwise_fast
ModuleNotFoundError: No module named 'sklearn.utils._cython_blas'
[3372] Failed to execute script GUI

我知道我已经通过命令提示符显式导入了sklearn,但是从追溯中看来,我似乎在某个地方缺少实用程序模块。我尝试专门导入缺少的模块,但是出现一个错误,提示没有可用的分布式模块。 我没有使用pyinstaller的丰富经验,也不知道从这里去哪里。我正在使用Windows 10和Python 3.7.3。

2 个答案:

答案 0 :(得分:0)

Pyinstaller似乎无法解决sklearn导入。因此,一种简单的方法是将位于<path_to_python>/Lib/site-packages/sklearn/中的整个模块目录带有可执行输出。因此,请使用以下规格文件生成可执行文件:

# -*- mode: python -*-

block_cipher = None


a = Analysis(['test.py'],
             pathex=['<path to root of your project>'],
             binaries=[],
             datas=[],
             hiddenimports=[],
             hookspath=[],
             runtime_hooks=[],
             excludes=[],
             win_no_prefer_redirects=False,
             win_private_assemblies=False,
             cipher=block_cipher,
             noarchive=False)
a.datas += Tree('<path_to_sklearn_in_python_dir>', prefix='sklearn')
pyz = PYZ(a.pure, a.zipped_data,
             cipher=block_cipher)
exe = EXE(pyz,
          a.scripts,
          a.binaries,
          a.zipfiles,
          a.datas,
          [],
          name='test',
          debug=False,
          bootloader_ignore_signals=False,
          strip=False,
          upx=False,
          runtime_tmpdir=None,
          console=True )

最后使用

生成可执行文件
pyinstaller test.spec

这应该可以解决sklearn的导入错误,但是如果您遇到其他NotFound导入,请像上面一样将它们添加到规格文件中。

答案 1 :(得分:0)

M.R.'s answer为基础,您可以直接在原始pyinstaller命令中包含sklearn的路径:

pyinstaller --onefile GUI.py --add-data "<path-to-python>\Lib\site-packages\sklearn;sklearn"

导致将以下代码行添加到自动生成的a = Analysis()文件的GUI.spec内:

datas=[('<path-to-python>\\Lib\\site-packages\\sklearn', 'sklearn')]

请注意,--onefile选项将导致可执行文件的启动比默认的单文件夹捆绑包慢(基于pyinstaller documentation和我自己捆绑{{1}的经验) }):

sklearn