8585 pyqt6-ver : ' !=6.6.0'
8686 # https://bugreports.qt.io/projects/PYSIDE/issues/PYSIDE-2346
8787 pyside6-ver : ' !=6.5.1'
88+ - os : ubuntu-22.04
89+ python-version : ' 3.13'
90+ # https://www.riverbankcomputing.com/pipermail/pyqt/2023-November/045606.html
91+ pyqt6-ver : ' !=6.6.0'
92+ # https://bugreports.qt.io/projects/PYSIDE/issues/PYSIDE-2346
93+ pyside6-ver : ' !=6.5.1'
94+ - name-suffix : " Free-threaded"
95+ os : ubuntu-22.04
96+ python-version : ' 3.13t'
97+ # https://www.riverbankcomputing.com/pipermail/pyqt/2023-November/045606.html
98+ pyqt6-ver : ' !=6.6.0'
99+ # https://bugreports.qt.io/projects/PYSIDE/issues/PYSIDE-2346
100+ pyside6-ver : ' !=6.5.1'
88101 - os : macos-12 # This runner is on Intel chips.
89102 python-version : ' 3.10'
90103 # https://bugreports.qt.io/projects/PYSIDE/issues/PYSIDE-2346
@@ -93,6 +106,10 @@ jobs:
93106 python-version : ' 3.12'
94107 # https://bugreports.qt.io/projects/PYSIDE/issues/PYSIDE-2346
95108 pyside6-ver : ' !=6.5.1'
109+ - os : macos-14 # This runner is on M1 (arm64) chips.
110+ python-version : ' 3.13'
111+ # https://bugreports.qt.io/projects/PYSIDE/issues/PYSIDE-2346
112+ pyside6-ver : ' !=6.5.1'
96113
97114 steps :
98115 - uses : actions/checkout@v4
@@ -101,8 +118,17 @@ jobs:
101118
102119 - name : Set up Python ${{ matrix.python-version }}
103120 uses : actions/setup-python@v5
121+ if : matrix.python-version != '3.13t'
104122 with :
105123 python-version : ${{ matrix.python-version }}
124+ allow-prereleases : true
125+
126+ - name : Set up Python ${{ matrix.python-version }}
127+ uses : deadsnakes/action@6c8b9b82fe0b4344f4b98f2775fcc395df45e494 # v3.1.0
128+ if : matrix.python-version == '3.13t'
129+ with :
130+ python-version : ' 3.13'
131+ nogil : true
106132
107133 - name : Install OS dependencies
108134 run : |
@@ -149,6 +175,11 @@ jobs:
149175 texlive-luatex \
150176 texlive-pictures \
151177 texlive-xetex
178+ if [[ "${{ matrix.python-version }}" = '3.13t' ]]; then
179+ # TODO: Remove this once setup-python supports nogil distributions.
180+ sudo apt-get install -yy --no-install-recommends \
181+ python3.13-tk-nogil
182+ fi
152183 if [[ "${{ matrix.os }}" = ubuntu-20.04 ]]; then
153184 sudo apt-get install -yy --no-install-recommends libopengl0
154185 else # ubuntu-22.04
@@ -205,6 +236,15 @@ jobs:
205236 4-${{ runner.os }}-py${{ matrix.python-version }}-mpl-${{ github.ref }}-
206237 4-${{ runner.os }}-py${{ matrix.python-version }}-mpl-
207238
239+ - name : Install the nightly dependencies
240+ if : matrix.python-version == '3.13t'
241+ run : |
242+ python -m pip install pytz tzdata python-dateutil # Must be installed for Pandas.
243+ python -m pip install \
244+ --pre \
245+ --index-url https://pypi.anaconda.org/scientific-python-nightly-wheels/simple \
246+ --upgrade --only-binary=:all: numpy pandas pillow contourpy
247+
208248 - name : Install Python dependencies
209249 run : |
210250 # Upgrade pip and setuptools and wheel to get as clean an install as
@@ -230,6 +270,7 @@ jobs:
230270 # Sphinx is needed to run sphinxext tests
231271 python -m pip install --upgrade sphinx!=6.1.2
232272
273+ if [[ "${{ matrix.python-version }}" != '3.13t' ]]; then
233274 # GUI toolkits are pip-installable only for some versions of Python
234275 # so don't fail if we can't install them. Make it easier to check
235276 # whether the install was successful by trying to import the toolkit
@@ -249,11 +290,11 @@ jobs:
249290 python -c 'import PyQt5.QtCore' &&
250291 echo 'PyQt5 is available' ||
251292 echo 'PyQt5 is not available'
252- # Even though PySide2 wheels can be installed on Python 3.12, they are broken and since PySide2 is
293+ # Even though PySide2 wheels can be installed on Python 3.12+ , they are broken and since PySide2 is
253294 # deprecated, they are unlikely to be fixed. For the same deprecation reason, there are no wheels
254295 # on M1 macOS, so don't bother there either.
255296 if [[ "${{ matrix.os }}" != 'macos-14'
256- && "${{ matrix.python-version }}" != '3.12' ]]; then
297+ && "${{ matrix.python-version }}" != '3.12' && "${{ matrix.python-version }}" != '3.13' ]]; then
257298 python -mpip install --upgrade pyside2${{ matrix.pyside2-ver }} &&
258299 python -c 'import PySide2.QtCore' &&
259300 echo 'PySide2 is available' ||
@@ -275,6 +316,8 @@ jobs:
275316 echo 'wxPython is available' ||
276317 echo 'wxPython is not available'
277318
319+ fi # Skip backends on Python 3.13t.
320+
278321 - name : Install the nightly dependencies
279322 # Only install the nightly dependencies during the scheduled event
280323 if : github.event_name == 'schedule' && matrix.name-suffix != '(Minimum Versions)'
@@ -313,6 +356,9 @@ jobs:
313356
314357 - name : Run pytest
315358 run : |
359+ if [[ "${{ matrix.python-version }}" == '3.13t' ]]; then
360+ export PYTHON_GIL=0
361+ fi
316362 pytest -rfEsXR -n auto \
317363 --maxfail=50 --timeout=300 --durations=25 \
318364 --cov-report=xml --cov=lib --log-level=DEBUG --color=yes
0 commit comments