An implementation of the py
command for UNIX-based platforms
(with some potential experimentation for good measure 😉)
The goal is to have py
become the cross-platform command that all Python users
use when executing a Python interpreter. By having a version-agnostic command
it side-steps the "what should the python
command point to?" debate by
clearly specifying that upfront (i.e. the newest version of Python that can be
found). This also unifies the suggested command to document for launching
Python on both Windows as UNIX as py
which has existed as the preferred
command on Windows for
some time.
See the top section of py --help
for instructions.
Please note that while searching, the search for a Python version can become more specific. This leads to a switch in the search algorithm to the one most appropriate to the specificity of the version.
- Search
PATH
forpython3.6
- Use the version found in the
PY_PYTHON3
environment variable if defined and not the empty string (e.g.PY_PYTHON3=3.6
) - Search
PATH
for all instances ofpython3.Y
- Find the executable with largest
Y
that earliest onPATH
- Use
${VIRTUAL_ENV}/bin/python
immediately if available - If the first argument is a file path ...
- Check for a shebang
- If executable starts with
/usr/bin/python
,/usr/local/bin/python
,/usr/bin/env python
orpython
, proceed based on the version found (barepython
is considered the equivalent of not specifying a Python version)
- Use the version found in the
PY_PYTHON
environment variable if defined (e.g.PY_PYTHON=3
orPY_PYTHON=3.6
) - Search
PATH
for all instances ofpythonX.Y
- Find the executable with the largest
X.Y
earliest onPATH
NOTE: I am using this project to learn Rust, so please don't be offended if I choose to implement something myself instead of accepting a pull request that you submit. (Pull requests to do something I have already implemented in a more idiomatic fashion are very much appreciated, though.)
PEP 397: Python launcher for Windows / PEP 486: Make the Python Launcher aware of virtual environments (documentation; source)
Everything in bold is required to hit MVP.
- Provide a
python_launcher
extension module- It will make the pipenv developers happy
- Might need a rename to
pylauncher
orpyfinder
to follow Python practices (if it isn't too much trouble)
- Windows support
PATH
- Windows Store (should be covered by
PATH
search, but need to make sure) - Registry
- Bitness
- Configuration files
(key thing to remember is should not get to the point that you're using this to alias
specific interpreters, just making it easier to specify constraints on what kind of
interpreter you need and then letting the launcher pick for you)
- Customized commands?
- Want a better format like TOML?
- Want a way to override/specify things, e.g. wanting a framework build on macOS?
- Aliasing? E.g.
2.7-framework
for/System/Library/Frameworks/Python.framework/Versions/2.7/Resources/Python.app/Contents/MacOS/Python
? - Just provide a way to specify a specific interpreter for a specific version?
E.g.
2.7
for/System/Library/Frameworks/Python.framework/Versions/2.7/Resources/Python.app/Contents/MacOS/Python
- What about implementations that don't install to e.g.
python3.7
likepypy3
?- Need more than just being able to alias
pypy3
to its Python version?
- Need more than just being able to alias
- Aliasing? E.g.
- How should the config file search work?
- Pre-defined locations?
- Walk up from current directory?
- XDG base directory specification?
- Replacement for
.venv/bin/python
(while keeping thepython
name)?VENV_REDIRECT
variant inlauncher.c
- Might need switch off CLI additions -- i.e.
-h
,--list
, and version specifier support -- in this situation to make this work - Read
../pyvenv.cfg
and itshome
key to determine where to look for the Python executable- What if
home
has multiple Python executables installed? Might need to add anexecutable
key to give full path to the creating interpreter.
- What if
- Acts as a heavyweight "symlink" to the Python executable for the virtual environment
- Speeds up environment creation by not having to copy over entire Python installation on Windows (e.g.
.pyd
files) - See/edit the
site
module to gain ability to specify virtual environment location (while maintaining the invariant on how to detect virtual environments as outlined in thevenv
module docs)
- Automatically detect
.venv/pyvenv.cfg
and use that (basically an implicit setting of$VIRTUAL_ENV
)? - Use
OsString
/OsStr
everywhere (versus now which is wherever it's easy w/path::Path
)?- Widest compatibility for people where they have undecodable paths (which is hopefully a very small minority)
- Massive pain to make work (e.g. cannot easily convert to a
CString
)
--json
flag for JSONified--list
output?- Would make consuming data from the CLI easier (e.g. for Nushell)
- Make sure all potential
panic!
points are rare enough to be acceptable - Have
--list
somehow denote an activated virtual environment?- Python Launcher doesn't denote or list anything
- Seems useful since that would take precedence if the user didn't specify a version
- Man page?
PYLAUNCH_DEBUG
? (Rust logging info)- Distribute binaries
- Flesh out documentation
- CLI documentation
- Flowchart of how the interpreter is selected?
- API documentation
- Get ~100% unit test coverage
- Consider dropping
nix
for a straightlibc
dependency (to potentially make Debian packaging easier)- Otherwise update
nix
to the latest version
- Otherwise update
Output from py --list
on Windows:
Installed Pythons found by C:\WINDOWS\py.exe Launcher for Windows
-3.8-64 *
-3.7-64
-3.6-64
-2.7-64
-2.7-64