pyinstaller / pyinstaller

Freeze (package) Python programs into stand-alone executables
http://www.pyinstaller.org
Other
11.84k stars 1.94k forks source link

PyInstaller with Stereopy gives TypeError #8134

Closed Dillonwong12 closed 10 months ago

Dillonwong12 commented 11 months ago

Hi, I'm attempting to create an executable with the package Stereopy. It is successfully generating the executable, but crashes upon starting with the following error message:

Traceback (most recent call last):
  File "Stereoseq_pipeline.py", line 11, in <module>
    import stereo as st
  File "<frozen importlib._bootstrap>", line 991, in _find_and_load
  File "<frozen importlib._bootstrap>", line 975, in _find_and_load_unlocked
  File "<frozen importlib._bootstrap>", line 671, in _load_unlocked
  File "PyInstaller\loader\pyimod02_importers.py", line 419, in exec_module
  File "stereo\__init__.py", line 6, in <module>
  File "<frozen importlib._bootstrap>", line 991, in _find_and_load
  File "<frozen importlib._bootstrap>", line 975, in _find_and_load_unlocked
  File "<frozen importlib._bootstrap>", line 671, in _load_unlocked
  File "PyInstaller\loader\pyimod02_importers.py", line 419, in exec_module
  File "stereo\io\__init__.py", line 9, in <module>
  File "<frozen importlib._bootstrap>", line 991, in _find_and_load
  File "<frozen importlib._bootstrap>", line 975, in _find_and_load_unlocked
  File "<frozen importlib._bootstrap>", line 671, in _load_unlocked
  File "PyInstaller\loader\pyimod02_importers.py", line 419, in exec_module
  File "stereo\io\reader.py", line 26, in <module>
  File "<frozen importlib._bootstrap>", line 991, in _find_and_load
  File "<frozen importlib._bootstrap>", line 975, in _find_and_load_unlocked
  File "<frozen importlib._bootstrap>", line 671, in _load_unlocked
  File "PyInstaller\loader\pyimod02_importers.py", line 419, in exec_module
  File "stereo\io\h5ad.py", line 24, in <module>
  File "<frozen importlib._bootstrap>", line 991, in _find_and_load
  File "<frozen importlib._bootstrap>", line 975, in _find_and_load_unlocked
  File "<frozen importlib._bootstrap>", line 671, in _load_unlocked
  File "PyInstaller\loader\pyimod02_importers.py", line 419, in exec_module
  File "stereo\core\__init__.py", line 10, in <module>
  File "<frozen importlib._bootstrap>", line 991, in _find_and_load
  File "<frozen importlib._bootstrap>", line 975, in _find_and_load_unlocked
  File "<frozen importlib._bootstrap>", line 671, in _load_unlocked
  File "PyInstaller\loader\pyimod02_importers.py", line 419, in exec_module
  File "stereo\core\st_pipeline.py", line 29, in <module>
  File "<frozen importlib._bootstrap>", line 991, in _find_and_load
  File "<frozen importlib._bootstrap>", line 975, in _find_and_load_unlocked
  File "<frozen importlib._bootstrap>", line 671, in _load_unlocked
  File "PyInstaller\loader\pyimod02_importers.py", line 419, in exec_module
  File "stereo\algorithm\__init__.py", line 1, in <module>
  File "<frozen importlib._bootstrap>", line 991, in _find_and_load
  File "<frozen importlib._bootstrap>", line 975, in _find_and_load_unlocked
  File "<frozen importlib._bootstrap>", line 671, in _load_unlocked
  File "PyInstaller\loader\pyimod02_importers.py", line 419, in exec_module
  File "stereo\algorithm\cell_cell_communication\__init__.py", line 2, in <module>
  File "<frozen importlib._bootstrap>", line 991, in _find_and_load
  File "<frozen importlib._bootstrap>", line 975, in _find_and_load_unlocked
  File "<frozen importlib._bootstrap>", line 671, in _load_unlocked
  File "PyInstaller\loader\pyimod02_importers.py", line 419, in exec_module
  File "stereo\algorithm\cell_cell_communication\plot_ccc.py", line 14, in <module>
  File "<frozen importlib._bootstrap>", line 991, in _find_and_load
  File "<frozen importlib._bootstrap>", line 975, in _find_and_load_unlocked
  File "<frozen importlib._bootstrap>", line 671, in _load_unlocked
  File "PyInstaller\loader\pyimod02_importers.py", line 419, in exec_module
  File "stereo\plots\__init__.py", line 15, in <module>
  File "<frozen importlib._bootstrap>", line 991, in _find_and_load
  File "<frozen importlib._bootstrap>", line 975, in _find_and_load_unlocked
  File "<frozen importlib._bootstrap>", line 671, in _load_unlocked
  File "PyInstaller\loader\pyimod02_importers.py", line 419, in exec_module
  File "stereo\plots\interact_plot\interactive_scatter.py", line 19, in <module>
  File "<frozen importlib._bootstrap>", line 991, in _find_and_load
  File "<frozen importlib._bootstrap>", line 975, in _find_and_load_unlocked
  File "<frozen importlib._bootstrap>", line 671, in _load_unlocked
  File "PyInstaller\loader\pyimod02_importers.py", line 419, in exec_module
  File "holoviews\operation\datashader.py", line 1585, in <module>
  File "holoviews\operation\datashader.py", line 1593, in SpreadingOperation
  File "distutils\version.py", line 58, in __le__
  File "distutils\version.py", line 337, in _cmp
TypeError: '<' not supported between instances of 'str' and 'int'
[14468] Failed to execute script 'Stereoseq_pipeline' due to unhandled exception!

I am working on a Windows 11 Pro machine, with Python 3.8.18 and PyInstaller 5.6. Here are all the other dependencies in my conda environment:

aiohttp                       3.9.1
aiosignal                     1.3.1
alabaster                     0.7.13
altgraph                      0.17.4
anndata                       0.7.5
arboreto                      0.1.6
asciitree                     0.3.3
async-timeout                 4.0.3
attrs                         23.1.0
Babel                         2.13.1
bleach                        6.1.0
blosc2                        2.0.0
bokeh                         2.4.3
boltons                       23.1.1
certifi                       2023.11.17
charset-normalizer            2.0.12
click                         8.1.7
cloudpickle                   3.0.0
colorama                      0.4.6
colorcet                      2.0.6
coloredlogs                   15.0.1
ctxcore                       0.2.0
cycler                        0.12.1
Cython                        3.0.6
cytoolz                       0.12.2
dask                          2022.11.1
dask-image                    2023.3.0
datashader                    0.14.1rc1
datashape                     0.5.2
dill                          0.3.7
distributed                   2022.11.1
docrep                        0.3.2
docutils                      0.20.1
fasteners                     0.19
fbpca                         1.0
flatbuffers                   23.5.26
fonttools                     4.45.1
frozendict                    2.3.10
frozenlist                    1.4.0
fsspec                        2023.10.0
future                        0.18.3
gefpy                         0.7.3
geojson                       3.1.0
geosketch                     1.2
get-annotations               0.1.2
gtfparse                      1.2.1
h5py                          3.7.0
harmonypy                     0.0.6
holoviews                     1.14.5
hotspotsc                     1.1.1
humanfriendly                 10.0
hvplot                        0.7.3
idna                          3.6
igraph                        0.9.11
imageio                       2.9.0
imagesize                     1.4.1
importlib-metadata            6.8.0
inflect                       7.0.0
interlap                      0.2.7
Jinja2                        3.0.3
joblib                        1.0.1
KDEpy                         1.1.0
keras                         2.7.0
kiwisolver                    1.4.5
leidenalg                     0.8.10
llvmlite                      0.39.1
locket                        1.0.0
loompy                        3.0.7
louvain                       0.7.1
Markdown                      3.5.1
MarkupSafe                    2.1.3
matplotlib                    3.5.2
matplotlib-scalebar           0.8.1
mpmath                        1.3.0
msgpack                       1.0.7
multidict                     6.0.4
multipledispatch              1.0.0
multiprocessing-on-dill       3.5.0a4
natsort                       7.1.1
networkx                      3.1
numba                         0.56.4
numcodecs                     0.12.1
numexpr                       2.8.6
numpy                         1.21.6
numpy-groupies                0.9.22
omnipath                      1.0.8
onnxruntime                   1.14.1
opencv-python                 4.5.5.64
packaging                     23.2
pandas                        1.5.3
panel                         0.13.1
param                         1.12.2
partd                         1.4.1
patsy                         0.5.3
pefile                        2023.2.7
PhenoGraph                    1.5.7
Pillow                        9.2.0
PIMS                          0.6.1
pip                           23.3.1
POT                           0.8.1.0
protobuf                      3.20.3
psutil                        5.9.6
py-cpuinfo                    9.0.0
pyarrow                       8.0.0
pyct                          0.5.0
pydantic                      1.10.13
Pygments                      2.17.2
pyinstaller                   5.6
pyinstaller-hooks-contrib     2023.10
pynndescent                   0.5.11
pyparsing                     3.1.1
pyreadline3                   3.4.1
pyscenic                      0.12.1
python-dateutil               2.8.2
pytz                          2023.3.post1
pyviz_comms                   3.0.0
PyWavelets                    1.4.1
pywin32                       227
pywin32-ctypes                0.2.2
PyYAML                        6.0.1
requests                      2.26.0
retrying                      1.3.4
scanpy                        1.9.6
scikit-image                  0.19.0
scikit-learn                  1.0.1
scipy                         1.7.3
seaborn                       0.11.2
session-info                  1.0.0
setuptools                    59.8.0
shapely                       2.0.2
six                           1.16.0
slicerator                    1.1.0
slideio                       0.5.225
snowballstemmer               2.2.0
sortedcontainers              2.4.0
spatialpandas                 0.4.9
Sphinx                        7.1.2
sphinxcontrib-applehelp       1.0.4
sphinxcontrib-devhelp         1.0.2
sphinxcontrib-htmlhelp        2.0.1
sphinxcontrib-jsmath          1.0.1
sphinxcontrib-qthelp          1.0.3
sphinxcontrib-serializinghtml 1.1.5
SQLAlchemy                    1.3.24
squidpy                       1.2.2
statsmodels                   0.12.1
stdlib-list                   0.10.0
stereopy                      0.12.1
sympy                         1.12
tables                        3.8.0
tblib                         3.0.0
texttable                     1.7.0
threadpoolctl                 3.2.0
tifffile                      2021.11.2
toolz                         0.12.0
tornado                       6.1
tqdm                          4.66.1
typing_extensions             4.3.0
umap-learn                    0.5.1
urllib3                       1.26.9
validators                    0.22.0
webencodings                  0.5.1
wheel                         0.41.2
wrapt                         1.16.0
xarray                        0.20.1
yarl                          1.9.3
zarr                          2.16.1
zict                          3.0.0
zipp                          3.17.0

Here are the commands required to recreate the issue:

conda create --name stereopy_env python=3.8

conda activate stereopy_env

pip install --use-pep517 stereopy

pip install pyinstaller==5.6`

Here is the .spec file I am using:


# -*- mode: python ; coding: utf-8 -*-
from PyInstaller.utils.hooks import copy_metadata
from PyInstaller.utils.hooks import collect_data_files
import sys 

sys.setrecursionlimit(sys.getrecursionlimit() * 5)

datas = collect_data_files("distributed")
datas += copy_metadata('scanpy', recursive=True)
datas += copy_metadata('scikit-learn', recursive=True)

block_cipher = None

a = Analysis(
    ['Stereoseq_pipeline.py'],
    pathex=['C:\\Users\\dillon.wong\\.conda\\envs\\stereopy_env\\Lib\\site-packages'],
    binaries=[],
    datas=datas,
    hiddenimports=['sklearn.metrics._pairwise_distances_reduction._datasets_pair', 'sklearn.metrics._pairwise_distances_reduction._base', 'sklearn.metrics._pairwise_distances_reduction._argkmin', 'sklearn.metrics._pairwise_distances_reduction._middle_term_computer'],
    hookspath=[],
    hooksconfig={},
    runtime_hooks=[],
    excludes=[],
    noarchive=False
)

pyz = PYZ(a.pure, a.zipped_data)

exe = EXE(
pyz,
a.scripts,
exclude_binaries=True,
name='Stereoseq_pipeline',
debug=False,
bootloader_ignore_signals=False,
strip=False,
upx=False,
console=False,
argv_emulation=False, 
)

I have no idea what could be causing this issue, and any help is much appreciated!

rokm commented 10 months ago

You need to ensure that .version file from datashader package is collected, otherwise datashader.__version__ used in holoviews ends up being invalid. I.e., add datas += collect_data_files('datashader') to your spec file.

Afterwards, you'll need to deal with additional missing metadata and hidden imports in other modules, but that's your standard fare with complex packages...