Name | pyprojectx JSON |
Version |
3.2.7
JSON |
| download |
home_page | None |
Summary | Execute scripts from pyproject.toml, installing tools on-the-fly |
upload_time | 2025-08-01 09:49:26 |
maintainer | None |
docs_url | None |
author | Houbie |
requires_python | >=3.8 |
license | MIT |
keywords |
build
dependency
pyprojectx
|
VCS |
 |
bugtrack_url |
|
requirements |
No requirements were recorded.
|
Travis-CI |
No Travis.
|
coveralls test coverage |
No coveralls.
|

# Pyprojectx: All-inclusive Python Projects
Execute scripts from pyproject.toml, installing tools on-the-fly
## [Full documentation](https://pyprojectx.github.io)
## Introduction
Pyprojectx makes it easy to create all-inclusive Python projects; no need to install any tools upfront,
not even Pyprojectx itself!
Tools that are specified within your pyproject.toml file will be installed on demand when invoked from Pyprojectx:
```shell
> ./pw ruff check src
Installed 1 package in 149ms
+ ruff==0.12.7
All checks passed!
```
## Feature highlights
* Reproducible builds by treating tools and utilities as (locked) dev-dependencies
* No global installs, everything is stored inside your project directory (like npm's _node_modules_)
* Bootstrap your entire build process with a small wrapper script (like Gradle's _gradlew_ wrapper)
* Configure shortcuts for routine tasks
* Simple configuration in _pyproject.toml_
Projects can be build/tested/used immediately without explicit installation nor initialization:
```bash
git clone https://github.com/pyprojectx/px-demo.git
cd px-demo
./pw build
```

## Installation
One of the key features is that there is no need to install anything explicitly (except a Python 3.9+ interpreter).
`cd` into your project directory and download the
[wrapper scripts](https://github.com/pyprojectx/pyprojectx/releases/latest/download/wrappers.zip):
**Linux/Mac**
```bash
curl -LO https://github.com/pyprojectx/pyprojectx/releases/latest/download/wrappers.zip && unzip wrappers.zip && rm -f wrappers.zip
```
**Windows**
```powershell
Invoke-WebRequest https://github.com/pyprojectx/pyprojectx/releases/latest/download/wrappers.zip -OutFile wrappers.zip; Expand-Archive -Path wrappers.zip -DestinationPath .; Remove-Item -Path wrappers.zip
```
## Getting started
Initialize a new or existing project by adding tools (on Windows, replace `./pw` with `pw`):
```bash
./pw --add uv,ruff,pre-commit,px-utils
./pw --install-context main
# invoke a tool via the wrapper script
./pw uv --version
./pw ruff check src
# or activate the tool context
source .pyprojectx/main/activate
uv --version
ruff check src
```
For reproducible builds and developer experience, it is recommended to lock the versions of the tools
and add the generated _pw.lock_ file to your repository:
```bash
./pw --lock
```
## Create command shortcuts
The _tool.pyprojectx.aliases_ section in _pyproject.toml_ can contain commandline aliases:
```toml
[tool.pyprojectx.aliases]
# convenience shortcuts
run = "uv run"
test = "uv run pytest"
lint = ["ruff check"]
check = ["@lint", "@test"]
```
## Usage
Instead of calling the CLI of a tool directly, prefix it with `./pw` (`pw` on Windows).
Examples:
```shell
./pw uv add --dev pytest
cd src
../pw lint
```
Aliases can be invoked as is or with extra arguments:
```shell
./pw uv run my-script --foo bar
# same as above, but using the run alias
./pw run my-script --foo bar
```
## Why yet another tool?
* As Python noob I had hard times setting up a project and building existing projects
* There is always someone in the team having issues with his setup, either with a specific tool, with Homebrew, pipx, ...
* Using (uv, PDM or Poetry) dev-dependencies to install tools, impacts your production dependencies and can even lead to dependency conflicts
* Different projects often require different versions of the same tool
## Example projects
* This project (using uv)
* [px-demo](https://github.com/pyprojectx/px-demo) (using uv, PDM or Poetry)
## Development
* Build/test:
```shell
git clone https://github.com/pyprojectx/pyprojectx.git
cd pyprojectx
./pw build
```
* Use your local pyprojectx copy in another project: set the path to pyprojectx in the _PYPROJECTX_PACKAGE_ environment variable
and create a symlink to the wrapper script.
```shell
# Linux, Mac
export PYPROJECTX_PACKAGE=path/to/pyprojectx
ln -s $PYPROJECTX_PACKAGE/src/pyprojectx/wrapper/pw.py pw
# windows
set PYPROJECTX_PACKAGE=path/to/pyprojectx
mklink pw %PYPROJECTX_PACKAGE%\src\pyprojectx\wrapper\pw.py
# or copy the wrapper script if you can't create a symlink on windows
copy %PYPROJECTX_PACKAGE%\src\pyprojectx\wrapper\pw.py pw
```
Raw data
{
"_id": null,
"home_page": null,
"name": "pyprojectx",
"maintainer": null,
"docs_url": null,
"requires_python": ">=3.8",
"maintainer_email": null,
"keywords": "build, dependency, pyprojectx",
"author": "Houbie",
"author_email": "Houbie <ivo@houbrechts-it.be>",
"download_url": "https://files.pythonhosted.org/packages/59/6f/42dfb2599fe8b48af3ca64b944e0bb5cfc99a7a9032d110a4b1bd3d06c54/pyprojectx-3.2.7.tar.gz",
"platform": null,
"description": "\n\n# Pyprojectx: All-inclusive Python Projects\n\nExecute scripts from pyproject.toml, installing tools on-the-fly\n\n## [Full documentation](https://pyprojectx.github.io)\n\n## Introduction\nPyprojectx makes it easy to create all-inclusive Python projects; no need to install any tools upfront,\nnot even Pyprojectx itself!\n\nTools that are specified within your pyproject.toml file will be installed on demand when invoked from Pyprojectx:\n```shell\n> ./pw ruff check src\nInstalled 1 package in 149ms\n + ruff==0.12.7\n\nAll checks passed!\n```\n\n## Feature highlights\n* Reproducible builds by treating tools and utilities as (locked) dev-dependencies\n* No global installs, everything is stored inside your project directory (like npm's _node_modules_)\n* Bootstrap your entire build process with a small wrapper script (like Gradle's _gradlew_ wrapper)\n* Configure shortcuts for routine tasks\n* Simple configuration in _pyproject.toml_\n\nProjects can be build/tested/used immediately without explicit installation nor initialization:\n```bash\ngit clone https://github.com/pyprojectx/px-demo.git\ncd px-demo\n./pw build\n```\n\n\n## Installation\nOne of the key features is that there is no need to install anything explicitly (except a Python 3.9+ interpreter).\n\n`cd` into your project directory and download the\n[wrapper scripts](https://github.com/pyprojectx/pyprojectx/releases/latest/download/wrappers.zip):\n\n**Linux/Mac**\n```bash\ncurl -LO https://github.com/pyprojectx/pyprojectx/releases/latest/download/wrappers.zip && unzip wrappers.zip && rm -f wrappers.zip\n```\n\n**Windows**\n```powershell\nInvoke-WebRequest https://github.com/pyprojectx/pyprojectx/releases/latest/download/wrappers.zip -OutFile wrappers.zip; Expand-Archive -Path wrappers.zip -DestinationPath .; Remove-Item -Path wrappers.zip\n```\n\n## Getting started\nInitialize a new or existing project by adding tools (on Windows, replace `./pw` with `pw`):\n```bash\n./pw --add uv,ruff,pre-commit,px-utils\n./pw --install-context main\n# invoke a tool via the wrapper script\n./pw uv --version\n./pw ruff check src\n# or activate the tool context\nsource .pyprojectx/main/activate\nuv --version\nruff check src\n```\n\nFor reproducible builds and developer experience, it is recommended to lock the versions of the tools\nand add the generated _pw.lock_ file to your repository:\n```bash\n./pw --lock\n```\n\n## Create command shortcuts\nThe _tool.pyprojectx.aliases_ section in _pyproject.toml_ can contain commandline aliases:\n```toml\n[tool.pyprojectx.aliases]\n# convenience shortcuts\nrun = \"uv run\"\ntest = \"uv run pytest\"\nlint = [\"ruff check\"]\ncheck = [\"@lint\", \"@test\"]\n```\n\n## Usage\nInstead of calling the CLI of a tool directly, prefix it with `./pw` (`pw` on Windows).\n\nExamples:\n```shell\n./pw uv add --dev pytest\ncd src\n../pw lint\n```\n\nAliases can be invoked as is or with extra arguments:\n```shell\n./pw uv run my-script --foo bar\n# same as above, but using the run alias\n./pw run my-script --foo bar\n```\n\n## Why yet another tool?\n* As Python noob I had hard times setting up a project and building existing projects\n* There is always someone in the team having issues with his setup, either with a specific tool, with Homebrew, pipx, ...\n* Using (uv, PDM or Poetry) dev-dependencies to install tools, impacts your production dependencies and can even lead to dependency conflicts\n* Different projects often require different versions of the same tool\n\n## Example projects\n* This project (using uv)\n* [px-demo](https://github.com/pyprojectx/px-demo) (using uv, PDM or Poetry)\n\n## Development\n* Build/test:\n```shell\ngit clone https://github.com/pyprojectx/pyprojectx.git\ncd pyprojectx\n./pw build\n```\n\n* Use your local pyprojectx copy in another project: set the path to pyprojectx in the _PYPROJECTX_PACKAGE_ environment variable\n and create a symlink to the wrapper script.\n```shell\n# Linux, Mac\nexport PYPROJECTX_PACKAGE=path/to/pyprojectx\nln -s $PYPROJECTX_PACKAGE/src/pyprojectx/wrapper/pw.py pw\n# windows\nset PYPROJECTX_PACKAGE=path/to/pyprojectx\nmklink pw %PYPROJECTX_PACKAGE%\\src\\pyprojectx\\wrapper\\pw.py\n# or copy the wrapper script if you can't create a symlink on windows\ncopy %PYPROJECTX_PACKAGE%\\src\\pyprojectx\\wrapper\\pw.py pw\n```\n",
"bugtrack_url": null,
"license": "MIT",
"summary": "Execute scripts from pyproject.toml, installing tools on-the-fly",
"version": "3.2.7",
"project_urls": {
"documentation": "https://pyprojectx.github.io",
"homepage": "https://github.com/pyprojectx/pyprojectx"
},
"split_keywords": [
"build",
" dependency",
" pyprojectx"
],
"urls": [
{
"comment_text": null,
"digests": {
"blake2b_256": "449571cec8f3f4a15999f272374e12db41c63c2e30c175acbcb630d6e768a0b1",
"md5": "a2f28446c08651630d66423a0d6ff625",
"sha256": "746624501adf13136ba69bcc88f2448cc8072ab1a4162f327a6977119d8d5a64"
},
"downloads": -1,
"filename": "pyprojectx-3.2.7-py3-none-any.whl",
"has_sig": false,
"md5_digest": "a2f28446c08651630d66423a0d6ff625",
"packagetype": "bdist_wheel",
"python_version": "py3",
"requires_python": ">=3.8",
"size": 21457,
"upload_time": "2025-08-01T09:49:25",
"upload_time_iso_8601": "2025-08-01T09:49:25.200427Z",
"url": "https://files.pythonhosted.org/packages/44/95/71cec8f3f4a15999f272374e12db41c63c2e30c175acbcb630d6e768a0b1/pyprojectx-3.2.7-py3-none-any.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": null,
"digests": {
"blake2b_256": "596f42dfb2599fe8b48af3ca64b944e0bb5cfc99a7a9032d110a4b1bd3d06c54",
"md5": "9fcf1510563d3e0babcc250a6e2276a9",
"sha256": "4f9d7e1ad89b9e59079297e2e85af0bdc3269b66e4d9952260c04eda029cfd43"
},
"downloads": -1,
"filename": "pyprojectx-3.2.7.tar.gz",
"has_sig": false,
"md5_digest": "9fcf1510563d3e0babcc250a6e2276a9",
"packagetype": "sdist",
"python_version": "source",
"requires_python": ">=3.8",
"size": 16602,
"upload_time": "2025-08-01T09:49:26",
"upload_time_iso_8601": "2025-08-01T09:49:26.496557Z",
"url": "https://files.pythonhosted.org/packages/59/6f/42dfb2599fe8b48af3ca64b944e0bb5cfc99a7a9032d110a4b1bd3d06c54/pyprojectx-3.2.7.tar.gz",
"yanked": false,
"yanked_reason": null
}
],
"upload_time": "2025-08-01 09:49:26",
"github": true,
"gitlab": false,
"bitbucket": false,
"codeberg": false,
"github_user": "pyprojectx",
"github_project": "pyprojectx",
"travis_ci": false,
"coveralls": false,
"github_actions": true,
"lcname": "pyprojectx"
}