Install a package and write to requirements.txt with pip

PythonPip

Python Problem Overview


I'm searching for a way to install a package with pip, and write that package's version information to my project's requirements.txt file. For those familiar with npm, it's essentially what npm install --save does.

Using pip freeze > requirements.txt works great, but I've found that I forget to run this, or I can accidentally include unused packages that I'd installed for testing but decided not to use.

So the following psuedocode:

$ pip install nose2 --save

Would result in a requirements.txt file with:

nose2==0.4.7

I guess I could munge the output of save to grab the version numbers, but I am hoping there is an easier way.

Python Solutions


Solution 1 - Python

To get the version information, you can actually use pip freeze selectively after install. Here is a function that should do what you are asking for:

pip_install_save() {
    package_name=$1
    requirements_file=$2
    if [[ -z $requirements_file ]]
    then
        requirements_file='./requirements.txt'
    fi
    pip install $package_name && pip freeze | grep -i $package_name >> $requirements_file
}

Note the -i to the grep command. Pip isn't case sensitive with package names, so you will probably want that.

Solution 2 - Python

I've written the following bash function which I use;

function pip-save() {
    for pkg in $@; do
        pip install "$pkg" && {
            name="$(pip show "$pkg" | grep Name: | awk '{print $2}')";
            version="$(pip show "$pkg" | grep Version: | awk '{print $2}')";
            echo "${name}==${version}" >> requirements.txt;
        }
    done
}

This saves the canonical package name to requirements, as well as the version installed. Example usage;

$ pip-save channels asgi_redis
# will save the following to requirements.txt (as of writing):
# ---
# channels==1.0.1
# asgi-redis==1.0.0
# ---
# note how asgi_redis is translated to its canonical name `asgi-redis`

Solution 3 - Python

Just add smth like

function pips() {
    echo $'\n'$1 >> requirements.txt; pip install $1
}

into your .bashrc or .bash_profile and use pips command to install package and save it's name into requirements.txt example:

pips django-waffle

based on Akash Kothawale comment :)

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionNick TomlinView Question on Stackoverflow
Solution 1 - PythondusktreaderView Answer on Stackoverflow
Solution 2 - PythonWilliamView Answer on Stackoverflow
Solution 3 - PythonMechanisMView Answer on Stackoverflow