Collectives™ on Stack Overflow
Find centralized, trusted content and collaborate around the technologies you use most.
Learn more about Collectives
Teams
Q&A for work
Connect and share knowledge within a single location that is structured and easy to search.
Learn more about Teams
site.ENABLE_USER_SITE
Flag showing the status of the user site-packages directory.
True
means that it is enabled and was added to
sys.path
.
False
means that it was disabled by user request (with
-s
or
PYTHONNOUSERSITE
). None means it was disabled for security reasons (mismatch between user or group id and effective id) or by an administrator.
I'm particularly interested in the phrase
or by an administrator
. On machines on which I'm an administrator (i.e. my own), how do I disable this option globally, for a specific interpreter executable?
The reason I want to do this is that new conda environments leave this enabled:
https://github.com/conda/conda/issues/448
The value of that variable is determined entirely in
Python code
:
def check_enableusersite():
"""Check if user site directory is safe for inclusion
The function tests for the command line flag (including environment var),
process uid/gid equal to effective uid/gid.
None: Disabled for security reasons
False: Disabled by user (command line option)
True: Safe and enabled
if sys.flags.no_user_site:
return False
if hasattr(os, "getuid") and hasattr(os, "geteuid"):
# check process uid == effective uid
if os.geteuid() != os.getuid():
return None
if hasattr(os, "getgid") and hasattr(os, "getegid"):
# check process gid == effective gid
if os.getegid() != os.getgid():
return None
return True
The first test is simply for the -s
switch or the PYTHONNOUSERSITE
environment variable having been used.
What remains is the tests that return None
if the effective userid or groupid differ from the process userid or groupid.
An administrator can set the effective user id or group id bits, at which point the effective user of the executable is changed to the owner or group of the executable rather than the user executing Python, at which point the above function will return None
.
Other than that, a sitecustomize.py
package could set the value to None
again, and explicitly remove user directories from the path again. If so, the usercustomize.py
import step is skipped.
–
–
–
–
–
Basically you can add the environment variable PYTHONNOUSERSITE=1
(just set it to something)
So if need to change it globally add this to the .bashrc
or whatever you use.
for conda:
You can specify variables that will be set for the specific environment see link
in short:
conda env config vars set PYTHONNOUSERSITE=1
and then reactivate your env
Had a similar issues where user accidentally installed packages in ~/.local/lib/python3.x/site-packages
with pip install --user <package>
and that broke their venv.
Found 3 ways to ignore local packages.
Set the environment variable PYTHONNOUSERSITE=1
before starting the interpreter
Start the interpreter with the -s flag python -s ...
Patch ENABLE_USER_SITE = None
to ENABLE_USER_SITE = False
in the .../lib/site.py
Source code: https://github.com/python/cpython/blob/main/Lib/site.py#L82
# Enable per user site-packages directory
# set it to False to disable the feature or True to force the feature
ENABLE_USER_SITE = None
Judging by the comment, I believe this is meant to be patchable.
sed -i 's/^ENABLE_USER_SITE = None/ENABLE_USER_SITE = False/g' .../lib/python${PYTHON_VERSION}/site.py
Thanks for contributing an answer to Stack Overflow!
- Please be sure to answer the question. Provide details and share your research!
But avoid …
- Asking for help, clarification, or responding to other answers.
- Making statements based on opinion; back them up with references or personal experience.
To learn more, see our tips on writing great answers.