[Python] How do I force Python to find packages inside my venv first?

Discussão em 'Python' iniciado por Stack, Fevereiro 25, 2025.

  1. Stack

    Stack Membro Participativo

    I'm having a problem making Python use installed packages in a venv virtual environment. I'm working in Windows with Python >= 3.9.

    My problem is that the path to the venv site-packages directory gets appended to the end of the sys.path, so that the locally installed site-packages are the last place Python looks. When I start the venv and interrogate the system path, I see the following list in this order:

    • Paths from my PYTHONPATH
    • Paths from the Python installation (AppData\Local)
    • My venv site-packages

    As a concrete example, with no PYTHONPATH defined:

    C:\Users\<userid>\<project>> env\Scripts\activate

    (env) C:\Users\<userid>\<project>> python
    Python 3.9.0 (tags/v3.9.0:9cf6752, Oct 5 2020, 15:34:40) [MSC v.1927 64 bit (AMD64)] on win32
    Type "help", "copyright", "credits" or "license" for more information.
    >>> import sys
    >>> for path in sys.path:
    ... print(path)
    ...

    C:\Users\<userid>\AppData\Local\Programs\Python\Python39\python39.zip
    C:\Users\<userid>\AppData\Local\Programs\Python\Python39\DLLs
    C:\Users\<userid>\AppData\Local\Programs\Python\Python39\lib
    C:\Users\<userid>\AppData\Local\Programs\Python\Python39
    C:\Users\<userid>\<project>\env
    C:\Users\<userid>\<project>\env\lib\site-packages
    >>>


    The predictable result is that any package installed in the base Python installation (e.g., maybe some random version of numpy) gets imported before the packages in the venv (e.g. a specific version of numpy that I need in that package). This seems to violate the spirit of a virtual environment, and it doesn't work for what I'm doing. I need the packages in the venv to be found and imported first. It would be really nice if I could add arbitrary paths to the list, but so far I haven't found any way to change the defaults.

    I've tried adding the line include-system-site-packages = false in my project's pyvenv.cfg, but it has no effect on the sys.path when I start the venv. I've tried creating a <project>.pth file in AppData\Local\Programs\Python\Python39\lib as recommended in How do you set your pythonpath in an already-created virtualenv?, but it also has no effect.

    What am I missing? How can I force Python to find packages in my venv before looking at anything installed outside the venv? And how do I add my own paths?

    Continue reading...

Compartilhe esta Página