Create a dev venv:
uv syncYou can then run portable-python from that venv:
.venv/bin/portable-python list
.venv/bin/portable-python build-report 3.10.5If you have tox, just run: tox to run all the tests. You can also run:
tox -e py313to run with just one python versiontox -e styleto check PEP8 formatting- etc
If you don't have tox, you can run the tests with: .venv/bin/pytest tests/
You can also run any of the tests/ in IDEs such as PyCharm or VSCode.
For example in PyCharm, just make sure that pytest is selected as "Default test runner"
in Preferences -> Tools -> Python Integrated Tools.
Then right-click on any file in tests/
(or in any function test_... function within a test_* file)
and select "Debug pytest in ..."
You can set breakpoints as well during such test runs.
You can easily run portable-python in a debugger.
In PyCharm for example, you would simply browse to .venv/bin/portable-python
then right-click and select "Debug portable-python".
You can then edit the build/run configuration in PyCharm, add some "Parameters" to it,
like for example build-report 3.13.2, and then set breakpoints wherever you like.
There is a --dryrun mode that can come in very handy for rapid iterations.
Build a docker image, for example using the provided sample Dockerfile:
docker build -t portable-python-jammy .Run the docker image, with a folder /src/ mounted to point to:
docker run -it -v./:/src/ portable-python-jammy /bin/bashNow inside docker, you run a build:
portable-python build 3.13.2| Package | Version | Purpose |
|---|---|---|
| click | <9 | CLI framework |
| pyyaml | <7 | Configuration parsing |
| requests | <3 | HTTP downloads |
| runez | <6 | Utilities (file ops, system, logging) |
| urllib3 | <3 | HTTP transport |
| pytest-cov | - | Coverage reporting (dev only) |
runez is central: provides file ops (ls_dir, touch, compress/decompress), system info (platform detection), CLI decorators (@click.group), logging, and version handling (Version, PythonSpec).
- Create class in
src/portable_python/external/xcpython.pyextendingModuleBuilder - Set
m_name,m_telltale,m_debian,versionproperty - Implement
urlproperty (or override_do_linux_compile()/_do_macos_compile()) - Add to
Cpython.candidate_modules()if it's a CPython sub-module - Add tests in
tests/test_setup.py
- Update
DEFAULT_CONFIGinsrc/portable_python/config.py - Use
PPG.config.get_value("key")to retrieve it in code - Add tests to
tests/test_setup.py
- Run
portable-python inspect <PATH>to diagnose - If lib is being dynamically linked, add to module list or update isolation
- Use
LibAutoCorrect.run()logic (or extend it) to fix paths - Add test case to
tests/test_inspector.py
- Update
pyproject.tomlclassifiers andrequires-python - Update
.github/workflows/tests.ymlmatrix - Update
CPythonFamily.min_versionif needed - Run full test matrix with
tox