Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion .github/workflows/register-pypi.yml
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,7 @@ jobs:
- name: Set up Python
uses: actions/setup-python@v7
with:
python-version: "3.10"
python-version: "3.11"
- name: Install build
run: >-
python -m
Expand Down
13 changes: 12 additions & 1 deletion .github/workflows/tests.yml
Original file line number Diff line number Diff line change
Expand Up @@ -41,6 +41,17 @@ jobs:

- uses: julia-actions/cache@v3

# The package cache includes Conda's build configuration, but not its root environment.
- name: Rebuild Conda configuration
shell: julia --color=yes {0}
env:
JULIA_PKG_PRECOMPILE_AUTO: '0'
run: |
using Pkg
Pkg.activate(; temp=true)
Pkg.add("Conda")
Pkg.build("Conda")

- name: Build package
uses: julia-actions/julia-buildpkg@v1
env:
Expand Down Expand Up @@ -83,7 +94,7 @@ jobs:
fail-fast: false
matrix:
os: [ubuntu-latest, windows-latest, macos-latest]
pyversion: ['3', '3.10']
pyversion: ['3', '3.11']
juliaexe: ["@JuliaPkg"]
include:
- os: ubuntu-latest
Expand Down
5 changes: 5 additions & 0 deletions AGENTS.md
Original file line number Diff line number Diff line change
Expand Up @@ -9,5 +9,10 @@

The majority of tests live in the Julia package; Python tests cover functionality that cannot be exercised from Julia (e.g., JuliaCall-specific behavior). Run both suites—typically Julia first—in whichever order makes sense.

- In restricted sandboxes, both suites need approval to write to the shared caches (`~/.julia` and `~/.cache/uv`).
- `pysrc/juliacall/juliapkg.json` is tracked; restore its original contents after using the development copy for Python tests.

## Meta instructions
- When testing an older Julia version, a local manifest generated by newer Julia can fail on stdlib dependencies. Use a temporary environment with `Pkg.develop(path=pwd()); Pkg.test("PythonCall")` to resolve dependencies for that Julia version.
- CI caches Conda.jl build configuration without its root environment. Rebuild Conda after cache restore before PyCall is built; otherwise Julia 1.10 can fail before tests with "Path to conda environment is not valid".
- When you discover environment quirks, false assumptions, process fixes, or any other generally useful info, update this AGENTS.md so future coding agents have the information.
3 changes: 3 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -1,5 +1,8 @@
# Changelog

## Unreleased
* Minimum supported Python version is now 3.11.

## 0.9.37 (2026-10-12)
* Compatibility fix with Python 3.15 from conda-forge, which no longer bundles libpython.
* Bug fixes.
Expand Down
2 changes: 1 addition & 1 deletion CondaPkg.toml
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@ version = "<=julia"

[deps.python]
build = "**cpython**"
version = ">=3.10,!=3.14.0,!=3.14.1,<4"
version = ">=3.11,!=3.14.0,!=3.14.1,<4"

[deps.libpython]
build = "**bundled-or-separate**"
Expand Down
2 changes: 1 addition & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,7 @@ Bringing [**Python®**](https://www.python.org/) and [**Julia**](https://juliala
- Fast non-copying conversion of numeric arrays in either direction: modify Python arrays (e.g. `bytes`, `array.array`, `numpy.ndarray`) from Julia or Julia arrays from Python.
- Helpful wrappers: interpret Python sequences, dictionaries, arrays, dataframes and IO streams as their Julia counterparts, and vice versa.
- Beautiful stack-traces.
- Supports modern systems: tested on Windows, MacOS and Linux; 64-bit; Julia 1.10 upwards and Python 3.10 upwards.
- Supports modern systems: tested on Windows, MacOS and Linux; 64-bit; Julia 1.10 upwards and Python 3.11 upwards.

⭐ If you like this, a GitHub star would be lovely thank you. ⭐

Expand Down
2 changes: 1 addition & 1 deletion docs/src/faq.md
Original file line number Diff line number Diff line change
Expand Up @@ -112,7 +112,7 @@ np = pyimport("numpy")
## What versions of Python and Julia do you support?

Each release of PythonCall and JuliaCall will support and require:
- Any currently supported version of Python, [see here](https://devguide.python.org/versions/). Currently 3.10+.
- Any currently supported version of Python, [see here](https://devguide.python.org/versions/). Currently 3.11+.
- The current Julia LTS version and newer, [see here](https://julialang.org/downloads/#long_term_support_release). Currently 1.10+.

Only the latest patch release within each minor version is supported.
2 changes: 1 addition & 1 deletion docs/src/index.md
Original file line number Diff line number Diff line change
Expand Up @@ -7,4 +7,4 @@ Bringing [**Python®**](https://www.python.org/) and [**Julia**](https://juliala
- Fast non-copying conversion of numeric arrays in either direction: modify Python arrays (e.g. `bytes`, `array.array`, `numpy.ndarray`) from Julia or Julia arrays from Python.
- Helpful wrappers: interpret Python sequences, dictionaries, arrays, dataframes and IO streams as their Julia counterparts, and vice versa.
- Beautiful stack-traces.
- Works anywhere: tested on Windows, MacOS and Linux; 64-bit; Julia 1.10 upwards and Python 3.10 upwards.
- Works anywhere: tested on Windows, MacOS and Linux; 64-bit; Julia 1.10 upwards and Python 3.11 upwards.
2 changes: 1 addition & 1 deletion pyproject.toml
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@ classifiers = [
"License :: OSI Approved :: MIT License",
"Operating System :: OS Independent",
]
requires-python = ">=3.10, <4"
requires-python = ">=3.11, <4"
dependencies = ["juliapkg >=0.1.27, <0.2"]

[dependency-groups]
Expand Down
4 changes: 2 additions & 2 deletions src/C/context.jl
Original file line number Diff line number Diff line change
Expand Up @@ -323,8 +323,8 @@ function init_context()
error("Cannot parse version from version string: $(repr(verstr))")
end
CTX.version = VersionNumber(vermatch.match)
v"3.10" ≤ CTX.version < v"4" || error(
"Only Python 3.10+ is supported, this is Python $(CTX.version) at $(CTX.exe_path===missing ? "unknown location" : CTX.exe_path).",
v"3.11" ≤ CTX.version < v"4" || error(
"Only Python 3.11+ is supported, this is Python $(CTX.version) at $(CTX.exe_path===missing ? "unknown location" : CTX.exe_path).",
)
CTX.is_free_threaded = occursin("free-threading build", verstr)

Expand Down
Loading