ChatGPT解决这个技术问题 Extra ChatGPT

How do I find out my PYTHONPATH using Python?

How do I find out which directories are listed in my system’s PYTHONPATH variable, from within a Python script (or the interactive shell)?

I'm not sure what are you trying to do, but if you want to know which folders are used to search for modules being imported you should not rely on PYTHONPATH. Use sys.path for that.
By simple experiment, I found Vanuan's answer below (printing sys.path) just prints PYTHONPATH. This works after we alter the value using add_path(new_path) which adds to PYTHONPATH.
The title of this post and the body ask two different questions. sys.path is "A list of strings that specifies the search path for modules" - docs.python.org/2/library/sys.html#sys.path. PYTHONPATH is an environment variable that effects this list. By any reasonable definition sys.path is your "python path".
Don't forget about python -m site.

V
Vanuan

You would probably also want this:

import sys
print(sys.path)

Or as a one liner from the terminal:

python -c "import sys; print('\n'.join(sys.path))"

Caveat: If you have multiple versions of Python installed you should use a corresponding command python2 or python3.


Same. Linux aaa.com 2.6.18-4-686-bigmem #1 SMP Wed Jun 6 09:41:07 UTC 2007 i686 GNU/Linux ... Debian Sarge
This is the platform- and environment- independent way to get the current runtime's python path.
This answer was much more helpful for my situation than the accepted answer. I know what my environment variables is. I needed to know where python decided to point besides my environment variable.
For Python 3: python -c "import sys; print('\n'.join(sys.path))"
@mirceamironenco changed
M
Mark Ransom

sys.path might include items that aren't specifically in your PYTHONPATH environment variable. To query the variable directly, use:

import os
try:
    user_paths = os.environ['PYTHONPATH'].split(os.pathsep)
except KeyError:
    user_paths = []

(or, more generically ...split(os.sep) ). Can't figure out why you're not getting the love, Mark. Your reply is technically more accurate than Paul D Waite's own reply to his question ????
os.sep is incorrect, see stackoverflow.com/questions/1499019/…
And that problem with the separator is probably why I wasn't getting the love. Thanks for setting me straight.
And if receive a KeyError, does it means that PYTHONPATH is not defined in my system? Is that a problem? Thanks
@glarrin, correct - KeyError means that PYTHONPATH is not defined. It won't be a problem because there's already default paths set up, see sys.path.
V
Vitali

Can't seem to edit the other answer. Has a minor error in that it is Windows-only. The more generic solution is to use os.pathsep as below:

sys.path might include items that aren't specifically in your PYTHONPATH environment variable. To query the variable directly, use:

import os
os.environ.get('PYTHONPATH', '').split(os.pathsep)

For future readers: os.sep returns the directory separator for the operating system, e.g. /. The separator used in the Python path is different, and returned by os.pathsep as shown in the accepted answer.
Thanks for the fix. I always get them mixed up when writing code by hand.
L
Leon Chang

PYTHONPATH is an environment variable whose value is a list of directories. Once set, it is used by Python to search for imported modules, along with other std. and 3rd-party library directories listed in Python's "sys.path".

As any other environment variables, you can either export it in shell or in ~/.bashrc, see here. You can query os.environ['PYTHONPATH'] for its value in Python as shown below:

$ python3 -c "import os, sys; print(os.environ['PYTHONPATH']); print(sys.path) if 'PYTHONPATH' in sorted(os.environ) else print('PYTHONPATH is not defined')"

IF defined in shell as

$ export PYTHONPATH=$HOME/Documents/DjangoTutorial/mysite

THEN result =>

/home/Documents/DjangoTutorial/mysite
['', '/home/Documents/DjangoTutorial/mysite', '/usr/local/lib/python37.zip', '/usr/local/lib/python3.7', '/usr/local/lib/python3.7/lib-dynload', '/usr/local/lib/python3.7/site-packages']

ELSE result =>

PYTHONPATH is not defined

To set PYTHONPATH to multiple paths, see here.

Note that one can add or delete a search path via sys.path.insert(), del or remove() at run-time, but NOT through os.environ[]. Example:

>>> os.environ['PYTHONPATH']="$HOME/Documents/DjangoTutorial/mysite"
>>> 'PYTHONPATH' in sorted(os.environ)
True
>>> sys.path // but Not there
['', '/usr/local/lib/python37.zip', '/usr/local/lib/python3.7', '/usr/local/lib/python3.7/lib-dynload', '/usr/local/lib/python3.7/site-packages']

>>> sys.path.insert(0,os.environ['PYTHONPATH'])
>>> sys.path // It's there
['$HOME/Documents/DjangoTutorial/mysite', '', '/usr/local/lib/python37.zip', '/usr/local/lib/python3.7', '/usr/local/lib/python3.7/lib-dynload', '/usr/local/lib/python3.7/site-packages']
>>> 

In summary, PYTHONPATH is one way of specifying the Python search path(s) for imported modules in sys.path. You can also apply list operations directly to sys.path without the aid of PYTHONPATH.


j
juggler

Works in windows 10, essentially identical to vanuan's answer, but cleaner (taken from somewhere, can't remember where..):

import sys
for p in sys.path:
    print(p)

This one line does the same job import sys; print('\n'.join(sys.path))
R
Rakend Dubba
import subprocess
python_path = subprocess.check_output("which python", shell=True).strip()
python_path = python_path.decode('utf-8')

This is not relevant to the question; PYTHONPATH is not "where Python lives", but an environment variable with additional paths to search for modules.
C
C4rnot

Python tells me where it lives when it gives me an error message :)

>>> import os
>>> os.environ['PYTHONPATH'].split(os.pathsep)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "C:\Users\martin\AppData\Local\Programs\Python\Python36-32\lib\os.py", line 669, in __getitem__
    raise KeyError(key) from None
KeyError: 'PYTHONPATH'
>>>

This is not relevant to the question; PYTHONPATH is not "where Python lives", but an environment variable with additional paths to search for modules.
V
Victor Ezekiel

Use the command,

$ which python

remember to enter this in the correct environment so use:

$ conda activate <env>

or

$ mamba activate <env>

If you do not have a conda environment, $ which python or $ which python3 would do just fine.


Your answer could be improved with additional supporting information. Please edit to add further details, such as citations or documentation, so that others can confirm that your answer is correct. You can find more information on how to write good answers in the help center.
This is not relevant to the question; PYTHONPATH is not "where Python lives", but an environment variable with additional paths to search for modules.
S
Sandro Braun

If using conda, you can get the env prefix using os.environ["CONDA_PREFIX"].


Z
ZF007
import sys
for a in sys.path:
    a.replace('\\\\','\\')
    print(a)

It will give all the paths ready for place in the Windows.


Calling .replace on a string does not modify the string, but instead creates a new one which is ignored in this code. Not that it matters, because there is no good reason to unescape the backslashes anyway. Path strings from sys.path are usable on that system as is.