I am thrilled python interoperability now seems to work for me with my APPLE M1 MacBookPro and MATLAB V2025a. The available instructions are still, shall we say, cryptic. Here is a summary of my interaction with GPT 4o to get this to work.
===========================================================
MATLAB R2025a + Python (Astropy) Integration on Apple Silicon (M1/M2/M3 Macs)
===========================================================
Author: D. Carlsmith, documented with ChatGPT
Last updated: July 2025
This guide provides full instructions, gotchas, and workarounds to run Python 3.10 with MATLAB R2025a (Apple Silicon/macOS) using native ARM64 Python and calling modules like Astropy, Numpy, etc. from within MATLAB.
===========================================================
Overview
===========================================================
- MATLAB R2025a on Apple Silicon (M1/M2/M3) runs as "maca64" (native ARM64).
- To call Python from MATLAB, the Python interpreter must match that architecture (ARM64).
- Using Intel Python (x86_64) with native MATLAB WILL NOT WORK.
- The cleanest solution: use Miniforge3 (Conda-forge's lightweight ARM64 distribution).
===========================================================
1. Install Miniforge3 (ARM64-native Conda)
===========================================================
In Terminal, run:
    curl -LO https://github.com/conda-forge/miniforge/releases/latest/download/Miniforge3-MacOSX-arm64.sh
    bash Miniforge3-MacOSX-arm64.sh
Follow prompts:
- Press ENTER to scroll through license.
- Type "yes" when asked to accept the license.
- Press ENTER to accept the default install location: ~/miniforge3
- When asked:
    Do you wish to update your shell profile to automatically initialize conda? [yes|no]
  Type: yes
===========================================================
2. Restart Terminal and Create a Python Environment for MATLAB
===========================================================
Run the following:
    conda create -n matlab python=3.10 astropy numpy -y
    conda activate matlab
Verify the Python path:
    which python
Expected output:
    /Users/YOURNAME/miniforge3/envs/matlab/bin/python
===========================================================
3. Verify Python + Astropy From Terminal
===========================================================
Run:
    python -c "import astropy; print(astropy.__version__)"
Expected output:
    6.x.x  (or similar)
===========================================================
4. Configure MATLAB to Use This Python
===========================================================
In MATLAB R2025a (Apple Silicon):
    clear classes
    pyenv('Version', '/Users/YOURNAME/miniforge3/envs/matlab/bin/python')
    py.sys.version
You should see the Python version printed (e.g. 3.10.18). No error means it's working.
===========================================================
5. Gotchas and Their Solutions
===========================================================
❌ Error: Python API functions are not available
→ Cause: Wrong architecture or broken .dylib
→ Fix: Use Miniforge ARM64 Python. DO NOT use Intel Anaconda.
❌ Error: Invalid text character (↑ points at __version__)
→ Cause: MATLAB can’t parse double underscores typed or pasted
→ Fix: Use: py.getattr(module, '__version__')
❌ Error: Unrecognized method 'separation' or 'sec'
→ Cause: MATLAB can't reflect dynamic Python methods
→ Fix: Use: py.getattr(obj, 'method')(args)
===========================================================
6. Run Full Verification in MATLAB
===========================================================
Paste this into MATLAB:
    % Set environment
    clear classes
    pyenv('Version', '/Users/YOURNAME/miniforge3/envs/matlab/bin/python');
    % Import modules
    coords = py.importlib.import_module('astropy.coordinates');
    time_mod = py.importlib.import_module('astropy.time');
    table_mod = py.importlib.import_module('astropy.table');
    % Astropy version
    ver = char(py.getattr(py.importlib.import_module('astropy'), '__version__'));
    disp(['Astropy version: ', ver]);
    % SkyCoord angular separation
    c1 = coords.SkyCoord('10h21m00s', '+41d12m00s', pyargs('frame', 'icrs'));
    c2 = coords.SkyCoord('10h22m00s', '+41d15m00s', pyargs('frame', 'icrs'));
    sep_fn = py.getattr(c1, 'separation');
    sep = sep_fn(c2);
    arcsec = double(sep.to('arcsec').value);
    fprintf('Angular separation = %.3f arcsec\n', arcsec);
    % Time difference in seconds
    Time = time_mod.Time;
    t1 = Time('2025-01-01T00:00:00', pyargs('format','isot','scale','utc'));
    t2 = Time('2025-01-02T00:00:00', pyargs('format','isot','scale','utc'));
    dt = py.getattr(t2, '__sub__')(t1);
    seconds = double(py.getattr(dt, 'sec'));
    fprintf('Time difference = %.0f seconds\n', seconds);
    % Astropy table display
    tbl = table_mod.Table(pyargs('names', {'a','b'}, 'dtype', {'int','float'}));
    tbl.add_row({1, 2.5});
    tbl.add_row({2, 3.7});
    disp(tbl);
===========================================================
7. Optional: Automatically Configure Python in startup.m
===========================================================
To avoid calling pyenv() every time, edit your MATLAB startup:
    edit startup.m
Add:
    try
        pyenv('Version', '/Users/YOURNAME/miniforge3/envs/matlab/bin/python');
    catch
        warning("Python already loaded.");
    end
===========================================================
8. Final Notes
===========================================================
- This setup avoids all architecture mismatches.
- It uses a clean, minimal ARM64 Python that integrates seamlessly with MATLAB.
- Do not mix Anaconda (Intel) with Apple Silicon MATLAB.
- Use py.getattr for any Python attribute containing underscores or that MATLAB can't resolve.
You can now run NumPy, Astropy, Pandas, Astroquery, Matplotlib, and more directly from MATLAB.
===========================================================