How can I use a pip requirements file to uninstall as well as install packages?

前端 未结 10 1189
猫巷女王i
猫巷女王i 2021-01-30 04:48

I have a pip requirements file that changes during development.

Can pip be made to uninstall packages that do not appear in the requirement

相关标签:
10条回答
  • 2021-01-30 05:17

    This is an old question (but a good one), and things have changed substantially since it was asked.

    There's an offhand reference to pip-sync in another answer, but deserves its own answer, because it solves precisely the OP's problem.

    pip-sync takes a requirements.txt file as input, and "trues up" your current Python environment so that it matches exactly what's in that requirements.txt. This includes removing any packages that are present in your env but absent from requirements.txt.

    Example: Suppose we want our env to contain (only) 3 libraries: libA, libB, and libC, like so:

    > cat requirements.txt
    libA==1.0
    libB==1.1
    libC==1.2
    

    But our env currently contains libC and libD:

    > pip freeze
    libC==1.2
    libD==1.3
    

    Running pip-sync will result in this, which was our desired final state:

    > pip-sync requirements.txt
    > pip freeze
    libA==1.0
    libB==1.1
    libC==1.2
    
    0 讨论(0)
  • 2021-01-30 05:17

    Stephen's proposal is a nice idea, but unfortunately it doesn't work if you include only direct requirements in your file, which sounds cleaner to me.

    All dependencies will be uninstalled, including even distribute, breaking down pip itself.

    Maintaining a clean requirements file while version tracking a virtual environment

    Here is how I try to version-track my virtual environment. I try to maintain a minimal requirements.txt, including only the direct requirements, and not even mentioning version constraints where I'm not sure.

    But besides, I keep, and include in version tracking (say git), the actual status of my virtualenv in a venv.pip file.

    Here is a sample workflow:


    setup virtualenv workspace, with version tracking:

    mkdir /tmp/pip_uninstalling
    cd /tmp/pip_uninstalling
    virtualenv venv
    . venv/bin/activate
    

    initialize version tracking system:

    git init
    echo venv > .gitignore
    pip freeze > venv.pip
    git add .gitignore venv.pip
    git commit -m "Python project with venv"
    

    install a package with dependencies, include it in requirements file:

    echo flask > requirements.txt
    pip install -r requirements.txt
    pip freeze > venv.pip
    

    Now start building your app, then commit and start a new branch:

    vim myapp.py
    git commit -am "Simple flask application"
    git checkout -b "experiments"
    

    install an extra package:

    echo flask-script >> requirements.txt
    pip install -r requirements.txt
    pip freeze > venv.pip
    

    ... play with it, and then come back to earlier version

    vim manage.py
    git commit -am "Playing with flask-script"
    git checkout master
    

    Now uninstall extraneous packages:

    pip freeze | grep -v -f venv.pip | xargs pip uninstall -y
    

    I suppose the process can be automated with git hooks, but let's not go off topic.

    Of course, it makes sense then to use some package caching system or local repository like pip2pi

    0 讨论(0)
  • 2021-01-30 05:17

    While this doesn't directly answer the question, a better alternative to requirements.txt now is using a Pipfile. This functions similarly to a Ruby Gemfile. Currently, you need to make use of the pipenv tool but hopefully this will eventually be incorporated into pip. This provides the pipenv clean command which does what you want.

    (Note that you can import an existing requirements.txt with pipenv install -r requirements.txt. After this you should have a Pipfile and the requirements.txt can be removed.)

    0 讨论(0)
  • 2021-01-30 05:24

    The short answer is no, you can't do that with pip.

    0 讨论(0)
  • 2021-01-30 05:27

    It is possible now using:

    pip uninstall -r requirements.txt
    
    0 讨论(0)
  • 2021-01-30 05:30

    It's not a feature of pip, no. If you really want such a thing, you could write a script to compare the output of pip freeze with your requirements.txt, but it would likely be more hassle than it's worth.

    Using virtualenv, it is easier and more reliable to just create a clean environment and (re)install from requirements.txt, like:

    deactivate
    rm -rf venv/
    virtualenv venv/
    source venv/bin/activate
    pip install -r requirements.txt
    
    0 讨论(0)
提交回复
热议问题