indygreg/PyOxidizer

Error when importing setuptools in code

hariom-qure opened this issue · 1 comments

Our project uses Cythonize and setuptools in a dependency. The output generated by pyoxidizer fails when it encounters the import in code.

  • Project is django based. Django==3.2.5
  • pyoxidizer==0.24.0

OS details

Distributor ID: Ubuntu
Description:    Ubuntu 20.04.4 LTS
Release:        20.04
Codename:       focal

Linux: 5.4.0-109-generic

Error trace

Traceback (most recent call last):
  File "runpy", line 197, in _run_module_as_main
  File "runpy", line 87, in _run_code
  File "/home/users/hariom.narang/qureapp/build/x86_64-unknown-linux-gnu/debug/install/lib/qureapp/__main__.py", line 35, in <module>
    main()
  File "/home/users/hariom.narang/qureapp/build/x86_64-unknown-linux-gnu/debug/install/lib/qureapp/__main__.py", line 31, in main
    execute_from_command_line(args)
  File "/home/users/hariom.narang/qureapp/build/x86_64-unknown-linux-gnu/debug/install/lib/django/core/management/__init__.py", line 419, in execute_from_command_line
    utility.execute()
  File "/home/users/hariom.narang/qureapp/build/x86_64-unknown-linux-gnu/debug/install/lib/django/core/management/__init__.py", line 395, in execute
    django.setup()
  File "/home/users/hariom.narang/qureapp/build/x86_64-unknown-linux-gnu/debug/install/lib/django/__init__.py", line 24, in setup
    apps.populate(settings.INSTALLED_APPS)
  File "/home/users/hariom.narang/qureapp/build/x86_64-unknown-linux-gnu/debug/install/lib/django/apps/registry.py", line 114, in populate
    app_config.import_models()
  File "/home/users/hariom.narang/qureapp/build/x86_64-unknown-linux-gnu/debug/install/lib/django/apps/config.py", line 301, in import_models
    self.models_module = import_module(models_module_name)
  File "importlib", line 127, in import_module
  File "<frozen importlib._bootstrap>", line 1030, in _gcd_import
  File "<frozen importlib._bootstrap>", line 1007, in _find_and_load
  File "<frozen importlib._bootstrap>", line 986, in _find_and_load_unlocked
  File "<frozen importlib._bootstrap>", line 680, in _load_unlocked
  File "<frozen importlib._bootstrap_external>", line 850, in exec_module
  File "<frozen importlib._bootstrap>", line 228, in _call_with_frames_removed
  File "/home/users/hariom.narang/qureapp/build/x86_64-unknown-linux-gnu/debug/install/lib/qureapp/model_manager/models/__init__.py", line 1, in <module>
    from .sourcerunconfig import SourceRunConfig
  File "/home/users/hariom.narang/qureapp/build/x86_64-unknown-linux-gnu/debug/install/lib/qureapp/model_manager/models/sourcerunconfig.py", line 8, in <module>
    from model_manager.qct_tasks.utils.qct_service import default_qct_source_config
  File "/home/users/hariom.narang/qureapp/build/x86_64-unknown-linux-gnu/debug/install/lib/qureapp/model_manager/qct_tasks/utils/__init__.py", line 1, in <module>
    from .qct_service import get_sorted_dicoms_fpaths, get_qct_series_classifier
  File "/home/users/hariom.narang/qureapp/build/x86_64-unknown-linux-gnu/debug/install/lib/qureapp/model_manager/qct_tasks/utils/qct_service.py", line 8, in <module>
    from qct_prod import classify_dicom_series
  File "/home/users/hariom.narang/qureapp/build/x86_64-unknown-linux-gnu/debug/install/lib/qct_prod/__init__.py", line 4, in <module>
    from .prediction_controller import QCTPredictionController
  File "/home/users/hariom.narang/qureapp/build/x86_64-unknown-linux-gnu/debug/install/lib/qct_prod/prediction_controller.py", line 10, in <module>
    from segment_lung.lobe_apis import LobeSegmentation
  File "/home/users/hariom.narang/qureapp/build/x86_64-unknown-linux-gnu/debug/install/lib/segment_lung/lobe_apis.py", line 16, in <module>
    from .baseapi import SegmentationModelBase
  File "/home/users/hariom.narang/qureapp/build/x86_64-unknown-linux-gnu/debug/install/lib/segment_lung/baseapi.py", line 15, in <module>
    from segment_lung.security import torch_load_enc
  File "/home/users/hariom.narang/qureapp/build/x86_64-unknown-linux-gnu/debug/install/lib/segment_lung/security.py", line 7, in <module>
    from qure_adhoc.enc.qryptography import Crypter
  File "src/qure_adhoc/__init__.py", line 1, in init qure_adhoc.__init__
  File "src/qure_adhoc/cyth/__init__.py", line 1, in init qure_adhoc.cyth.__init__
  File "src/qure_adhoc/cyth/utils.py", line 8, in init qure_adhoc.cyth.utils
  File "src/qure_adhoc/cyth/qythonize.py", line 4, in init qure_adhoc.cyth.qythonize
  File "/tmp/pip-target-scl0epn3/lib/python/setuptools/__init__.py", line 8, in <module>
  File "/tmp/pip-target-scl0epn3/lib/python/_distutils_hack/override.py", line 1, in <module>
  File "/tmp/pip-target-scl0epn3/lib/python/_distutils_hack/__init__.py", line 77, in do_override
  File "/tmp/pip-target-scl0epn3/lib/python/_distutils_hack/__init__.py", line 64, in ensure_local_distutils
AssertionError: /home/users/hariom.narang/qureapp/build/x86_64-unknown-linux-gnu/debug/install/lib/distutils/core.py
jaraco commented

Later versions of Setuptools introduced a _distutils_hack that works to ensure that distutils is imported not from stdlib but from setuptools._distutils. It achieves this end by installing a MetaFinder that imports setuptools._distutils when distutils is requested. The fact that the assertion is triggering suggests that the MetaFinder isn't having any effect (perhaps because a Pyoxidizer meta finder is taking precedence).

I'd suggest setting a breakpoint at line 60 (inside the shim) and evaluate the environment to determine why import distutils isn't resolving from setuptools._distutils.

In the meantime, you may be able to work around the issue by setting SETUPTOOLS_USE_DISTUTILS=stdlib.