-
-
Notifications
You must be signed in to change notification settings - Fork 1.7k
PEP 796: Relative Virtual Environments #4476
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Open
rickeylev
wants to merge
38
commits into
python:main
Choose a base branch
from
rickeylev:relative.venvs
base: main
Could not load branches
Branch not found: {{ refName }}
Loading
Could not load tags
Nothing to show
Loading
Are you sure you want to change the base?
Some commits from the old base branch may be removed from the timeline,
and old review comments may become outdated.
Open
Changes from 1 commit
Commits
Show all changes
38 commits
Select commit
Hold shift + click to select a range
ceeaa3b
initial file
rickeylev d0a9289
add some core content
rickeylev 41d2ea8
rename to motivation
rickeylev 65a415c
note it enables more advanced optimizations
rickeylev 4175b20
add foot notes, relocatable term section, links
rickeylev bbc85b7
update discussion, sponsor headers to pending
rickeylev a0c2529
rst fixups
rickeylev 8e6e21e
fixup italics
rickeylev 37202ca
rename to relative-venv
rickeylev b81c50f
clarify advanced deployment options, reflow some text
rickeylev 55a5e28
add specification, rationale section; doc why env vars arent an option
rickeylev e09b00d
also mention curdir syntax handling
rickeylev c7a6a9b
update some todo text
rickeylev bc1ffbd
update codeowners
rickeylev 2301d2a
add initial discussion footnote link
rickeylev e14b01f
add fr footnote
rickeylev 175f378
revert codeowners change
rickeylev 31cb756
remove packaging-related specs
rickeylev cd46f4d
fix lint errors with headers
rickeylev b532f5c
set sponsor
rickeylev 99434fc
set sponsor as codeowner
rickeylev 862142a
clarify title to focus on core pyvenv.cfg home behavior
rickeylev 1c8fb2d
fix typo; remove host-relocatable mention; remove non-germane copying…
rickeylev c542890
fix typos, grammar
rickeylev 3240227
Apply suggestions from code review
rickeylev 557cb71
fix up markdown and text width
rickeylev 0579623
fix title underlines
rickeylev c9388b3
link to relative venv reference implementation
rickeylev b959f24
Apply suggestions from code review
rickeylev 5b259cc
Apply suggestions from code review
rickeylev 560dadb
Merge branch 'main' of https://github.com/python/peps into relative.v…
rickeylev f41ed51
Merge branch 'relative.venvs' of https://github.com/rickeylev/peps in…
rickeylev 5cbc9f5
better answer why/how relvenvs help; wrap some long lines
rickeylev 0af0eea
Apply AA-Turner suggestions
rickeylev 68dd5e0
add refs, remove CWD acronym, fix grammar
rickeylev b50a80c
address review comments: better split and organize rationale/motivation
rickeylev af8f880
Merge branch 'main' into relative.venvs
AA-Turner ae5a67f
Apply markup and simple grammar fixes from code review
ncoghlan File filter
Filter by extension
Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Apply AA-Turner suggestions
Co-authored-by: Alyssa Coghlan <[email protected]> Co-authored-by: Adam Turner <[email protected]> Co-authored-by: Stan Ulbrych <[email protected]>
- Loading branch information
Some comments aren't visible on the classic Files Changed page.
There are no files selected for viewing
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| Original file line number | Diff line number | Diff line change | ||||||
|---|---|---|---|---|---|---|---|---|
| @@ -1,22 +1,25 @@ | ||||||||
| PEP: 796 | ||||||||
| Title: Relative Virtual Environment Home | ||||||||
| Title: Relative Home Path in Virtual Environments | ||||||||
| Author: Richard Levasseur <[email protected]> | ||||||||
| Sponsor: Alyssa Coghlan <[email protected]> | ||||||||
| Discussions-To: Pending | ||||||||
| Status: Draft | ||||||||
| Type: Standards Track | ||||||||
| Created: 26-Jun-2025 | ||||||||
| Created: 02-Jul-2025 | ||||||||
| Python-Version: 3.15 | ||||||||
|
|
||||||||
|
|
||||||||
| Abstract | ||||||||
| ======== | ||||||||
|
|
||||||||
| This PEP describes how a relative path for ``home`` in a Python virtual | ||||||||
| environment's ``pyvenv.cfg`` is understood by the Python startup process. | ||||||||
| Specifically, how it is canonicalized into an absolute path later used | ||||||||
| by the runtime. This small detail is a fundamental building block for | ||||||||
| virtual environments to be more portable. | ||||||||
| This PEP formally specifies the use of a relative path for ``home`` | ||||||||
| in a Python virtual environment's :file:`pyvenv.cfg` file. | ||||||||
|
|
||||||||
| Specifically, we will discuss how such relative paths are understood | ||||||||
| by the Python startup process, including their conversion to absolute | ||||||||
| paths for use by the runtime. | ||||||||
| This is a fundamental building block for virtual environments to | ||||||||
| become more portable. | ||||||||
|
|
||||||||
| Motivation | ||||||||
| ========== | ||||||||
|
|
@@ -87,17 +90,19 @@ Specification | |||||||
| ============= | ||||||||
|
|
||||||||
| The ``home`` value in ``pyvenv.cfg`` is permitted to use a relative path value. | ||||||||
| These may contain up-references outside of the virtual environment root | ||||||||
| directory. Examples: | ||||||||
| These may contain parent-directory references outside of the virtual environment root | ||||||||
| directory. | ||||||||
| For example: | ||||||||
|
|
||||||||
| * ``subdir/whatever/bin`` (a directory within the virtual environment) | ||||||||
| * ``./subdir/whatever/bin`` (same as above) | ||||||||
| * ``../../../../../elsewhere/runtime/bin`` (a directory outside the virtual | ||||||||
| environment) | ||||||||
|
|
||||||||
| Relative paths are relative to the directory containing ``pyvenv.cfg``. During | ||||||||
| interpreter startup (i.e. ``getpath.py``), the relative path is joined to the | ||||||||
| directory to form an absolute path. Up-references (``../``) and current | ||||||||
| Relative paths are relative to the directory containing :file:`pyvenv.cfg`. | ||||||||
| During interpreter startup (i.e. :file:`getpath.py`), the relative path is joined to the | ||||||||
| directory containing ``pyvenv.cfg`` to form an absolute path. | ||||||||
| Parent-directory references (``../``) and current | ||||||||
| directory references (``./``) are resolved syntactically (i.e. not resolving | ||||||||
| symlinks). Symlinks are *not* resolved prior to construction of the absolute | ||||||||
| path to ensure semantics between a relative path and absolute path remain the | ||||||||
|
|
@@ -110,7 +115,7 @@ i.e. it's equivalent to using that value verbatim in ``pyvenv.cfg``. | |||||||
|
|
||||||||
|
|
||||||||
| CPython Runtime Changes | ||||||||
| ======================= | ||||||||
| ----------------------- | ||||||||
|
|
||||||||
| The CPython runtime itself *almost* already supports relative paths. The | ||||||||
| primitives are there, so the only change needed is to define how it resolves | ||||||||
|
|
@@ -133,16 +138,15 @@ This change is only a couple of lines in the startup code. Specifically, when | |||||||
| parsing the ``pyvenv.cfg`` file and finding the ``home`` value, it just needs | ||||||||
| to be checked if it's already absolute. If not, then join it to the directory | ||||||||
| name of the ``pyvenv.cfg`` file. The code already knows the directory and has | ||||||||
| helpers already present for checking if a path is absolute and joining two | ||||||||
| helpers already exist for checking if a path is absolute and joining two | ||||||||
| paths. | ||||||||
|
|
||||||||
| A proof-of-concept of this is implemented in | ||||||||
| A proof-of-concept of this is implemented in the author's branch, | ||||||||
| `rickeylev/feat.relative.pyvenv.home <https://github.com/python/cpython/compare/main...rickeylev:cpython:feat.relative.pyvenv.home>`__. | ||||||||
|
||||||||
| `rickeylev/feat.relative.pyvenv.home <https://github.com/python/cpython/compare/main...rickeylev:cpython:feat.relative.pyvenv.home>`__. | |
| `rickeylev/feat.relative.pyvenv.home | |
| <https://github.com/python/cpython/compare/main...rickeylev:cpython:feat.relative.pyvenv.home>`__. |
Please could you also wrap some of the other long lines to 79 chars?
ncoghlan marked this conversation as resolved.
Outdated
Show resolved
Hide resolved
ncoghlan marked this conversation as resolved.
Outdated
Show resolved
Hide resolved
Oops, something went wrong.
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
(I don't mind if this isn't accepted, I've just always referred to this style of resolution as lexical rather than as syntactic: python/cpython#124825