GitHub - gregneagle/relocatable-python: A tool for building standalone relocatable Python.framework bundles (original) (raw)

This is a tool to make a relocatable Python framework containing PyObjC.

NOTE: while the resulting frameworks (and interpreters) have been successfully used in several projects (among them Imagr, Munki, and AutoPkg) there is no guarantee it is suitable as a general-purpose Python installation.

A relocatable Python.framework is ideal for embedding into an application's Frameworks directory, and can even be used to get PyObjC-based apps and tools running in the macOS Recovery environment, which does not include Python.

The Python version defaults to 2.7.15, and minimum (or target) macOS version is 10.9. No modules are automatically installed. Previously, the highest supported versions of pip and PyObjC are installed, as is xattr 0.6.4 (this is the version included with macOS High Sierra -- the current version has issues running in Recovery boot). To install these, use --pip-requirements=requirements_python2_recommended.txt to mimic old behavior. In previous versions of this tool on Python versions 3.x and higher, certain modules (xattr, cffi, six and pyobjc) were installed. These can be installed via --pip-requirements=requirements_python3_recommended.txt.

Currently tested versions: Python version 2.7.15 with macOS deployment target 10.9+ Python version 3.7.4 with macOS deployment target 10.9+

Requires at least the command-line developer tools; might require a full Xcode install.

Basic use -- make a Python.framework in the current working directory: ./make_relocatable_python_framework.py

Specifying a target destination for the framework: ./make_relocatable_python_framework.py --destination ~/Desktop

Specifying a different Python version: ./make_relocatable_python_framework.py --python-version 3.7.4

More options: ./make_relocatable_python_framework.py --help

NOTES:

UNIVERSAL PYTHON

As of Python 3.9.11 (Mar 16, 2022), Python.org offers a Universal Python build. If you want to test if your framework is also fully universal, you can use the included "python_universal_tester.sh" script. It takes your version of Python as an argument:

% ./python_universal_tester.sh 3.10
Using Python 3.10
All files are universal!
% echo $?
0

The script must be run from the same directory as the built Python.framework. If any files are not universal, it will list them and exit 1.