Skip to content

mpmath 1.4.0 breaks Frozen Applications due to importlib.metadata usage #1044

Description

@FlurinArner

Summary

mpmath 1.4.0 breaks frozen applications (PyInstaller, py2app, cx_Freeze, Nuitka) by switching from hardcoded version strings to dynamic lookup via importlib.metadata.version().

Root Cause

mpmath 1.4.0 (mpmath/__init__.py L1-2):

from importlib.metadata import version
__version__ = version(__name__)

Previous versions (1.2.1, 1.3.0):

__version__ = '1.3.0'  # Hardcoded

Problem: Frozen applications bundle Python code but not package metadata (.dist-info directories), causing importlib.metadata.version() to fail with PackageNotFoundError.

Minimal Reproduction

Simulate frozen app behavior without requiring PyInstaller:

#!/usr/bin/env python3
"""Simulates frozen app behavior where package metadata is unavailable"""

import importlib.metadata

# Mock metadata to simulate frozen environment
original_version = importlib.metadata.version

def mock_version(package_name):
    if package_name == "mpmath":
        raise importlib.metadata.PackageNotFoundError(
            f"No package metadata was found for {package_name}"
        )
    return original_version(package_name)

importlib.metadata.version = mock_version

import mpmath  # ✗ FAILS on 1.4.0
print(f"mpmath version: {mpmath.__version__}")

Workarounds

Downgrade to mpmath 1.3.0:

pip install mpmath==1.3.0

or in Poetry:

mpmath = "1.3.0"

Proposed Solution

Use a fallback for when metadata is unavailable:

try:
    from importlib.metadata import version
    __version__ = version(__name__)
except Exception:
    # Fallback for frozen apps or when metadata unavailable
    __version__ = "1.4.0"  # Update this string in each release

Environment

  • mpmath: 1.4.0
  • Python: 3.10
    • expected on all 3.9+ versions supported by mpmath 1.4.0
  • Freezing tools: PyInstaller 5.4.1
    • expected on all others also (py2app, cx_Freeze, Nuitka)
  • OS: Windows

Metadata

Metadata

Assignees

No one assigned

    Labels

    bugan unexpected problem or unintended behaviortesting

    Type

    No type

    Fields

    No fields configured for issues without a type.

    Projects

    No projects

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions