Automatically create requirements.txt
PythonDependenciesPython Importrequirements.txtPython Problem Overview
Sometimes I download the python source code from github
and don't know how to install all the dependencies. If there is no requirements.txt
file I have to create it by hands.
The question is:
Given the python source code directory is it possible to create requirements.txt
automatically from the import section?
Python Solutions
Solution 1 - Python
You can use the following code to generate a requirements.txt file:
pip install pipreqs
pipreqs /path/to/project
more info related to pipreqs can be found here.
Sometimes you come across pip freeze
, but this saves all packages in the environment including those that you don't use in your current project.
Solution 2 - Python
Use Pipenv or other tools is recommended for improving your development flow.
pip3 freeze > requirements.txt # Python3
pip freeze > requirements.txt # Python2
If you do not use a virtual environment, pigar will be a good choice for you.
Solution 3 - Python
For python3: (I have both python 2 and 3 on my machine, where python2 is the default)
# install
pip3 install pipreqs
# Run in current directory
python3 -m pipreqs.pipreqs .
python2:
pip install pipreqs
python -m pipreqs.pipreqs .
To check your python version:
python --version
Solution 4 - Python
In my case, I use Anaconda, so running the following command from conda terminal inside my environment solved it, and created this requirements.txt
file for me automatically:
conda list -e > requirements.txt
This was taken from this Github link pratos/condaenv.txt
If an error been seen, and you are using anaconda, try to use the .yml
option:
conda env export > <environment-name>.yml
For other person to use the environment or if you are creating a new enviroment on another machine:
conda env create -f <environment-name>.yml
Solution 5 - Python
To create a requirement Python module list, write this code in your terminal:
pip3 freeze > requirements.txt
Solution 6 - Python
Firstly, your project file must be a py file which is direct python file. If your file is in ipynb format, you can convert it to py type by using the line of code below:
jupyter nbconvert --to=python
Then, you need to install pipreqs library from cmd (terminal for mac).
pip install pipreqs
Now we can create txt file by using the code below. If you are in the same path with your file, you can just write ./ . Otherwise you need to give path of your file.
pipreqs ./
or
pipreqs /home/project/location
That will create a requirements.txt file for your project.
Solution 7 - Python
Kinda mind-blowing how this simple task is so complicated in Python. Here is what I think is the best way to do it automatically.
You need two tools:
1.pipreqs
pip3 install pipreqs
pipreqs will go through your project and only install the packages that your project use. Instead of all the packages in your python environment as pip freeze
would do.
But there's a problem with this approach. It does not install the sub-packages.
For example, your project uses pandas==1.3.2
. pandas
itself uses numpy==1.21.2
among other packages. But pipreqs
itself does not write the sub-packages (i.e. numpy) in requirments.txt
This is where you need to combine pipreqs
with the second tool.
pip3 install pip-tools
pip-tools
will take the packages in requirements.in
and generate the requirements.txt
with all the sub-packages. For example, if you have
pandas==1.3.2
in requirements.in
, pip-tools
would generate
numpy==1.21.2 # via pandas
in requirements.txt
.
But you need to manually add the package in requirements.in
. Which is prone to mistake and you might forget to do this once in a while.
This is where you can use the first tool.
But both the tools write to requirements.txt
. So how do you fix it?
Use the --savepath
for pipreqs
to write in requirements.in
instead of the default requirements.txt
.
To do it in one command; just do
pipreqs --savepath=requirements.in & pip-compile
There you go. Now you don't need to worry about manually maintaining the packages and you're requirements.txt
will have all the sub-packages so that your build is deterministic.
TL;DR
pip3 install pipreqs
pip3 install pip-tools
Use the following to build a deterministic requirements.txt
pipreqs --savepath=requirements.in && pip-compile
Solution 8 - Python
I blindly followed the accepted answer of using pip3 freeze > requirements.txt
It generated a huge file that listed all the dependencies of the entire solution, which is not what I wanted.
So you need to figure out what sort of requirements.txt you are trying to generate.
If you need a requirements.txt file that has ALL the dependencies, then use the pip3
pip3 freeze > requirements.txt
However, if you want to generate a minimal requirements.txt that only lists the dependencies you need, then use the pipreqs package. Especially helpful if you have numerous requirements.txt files in per component level in the project and not a single file on the solution wide level.
pip install pipreqs
pipreqs [path to folder]
e.g. pipreqs .
pipreqs . --force --ignore=tests (Overwrites exisiting requirements.txt, ignores the tests directory)
Solution 9 - Python
Make sure to run pip3 for python3.7.
pip3 freeze >> yourfile.txt
Before executing the above command make sure you have created a virtual environment.
python3:
pip3 install virtualenv
python3 -m venv <myenvname>
python2:
pip install virtualenv
virtualenv <myenvname>
After that put your source code in the directory. If you run the python file now, probably it won't launch if you are using non-native modules. You can install those modules by running pip3 install <module>
or pip install <module>
.
This will not affect you entire module list except the environment you are in.
Now you can execute the command at the top and now you have a requirements file which contains only the modules you installed in the virtual environment. Now you can run the command at the top.
I advise everyone to use environments as it makes things easier when it comes to stuff like this.
Solution 10 - Python
If Facing the same issue as mine i.e. not on the virtual environment and wants requirements.txt for a specific project or from the selected folder(includes children) and pipreqs is not supporting.
You can use :
import os
import sys
from fuzzywuzzy import fuzz
import subprocess
path = "C:/Users/Username/Desktop/DjangoProjects/restAPItest"
files = os.listdir(path)
pyfiles = []
for root, dirs, files in os.walk(path):
for file in files:
if file.endswith('.py'):
pyfiles.append(os.path.join(root, file))
stopWords = ['from', 'import',',','.']
importables = []
for file in pyfiles:
with open(file) as f:
content = f.readlines()
for line in content:
if "import" in line:
for sw in stopWords:
line = ' '.join(line.split(sw))
importables.append(line.strip().split(' ')[0])
importables = set(importables)
subprocess.call(f"pip freeze > {path}/requirements.txt", shell=True)
with open(path+'/requirements.txt') as req:
modules = req.readlines()
modules = {m.split('=')[0].lower() : m for m in modules}
notList = [''.join(i.split('_')) for i in sys.builtin_module_names]+['os']
new_requirements = []
for req_module in importables:
try :
new_requirements.append(modules[req_module])
except KeyError:
for k,v in modules.items():
if len(req_module)>1 and req_module not in notList:
if fuzz.partial_ratio(req_module,k) > 90:
new_requirements.append(modules[k])
new_requirements = [i for i in set(new_requirements)]
new_requirements
with open(path+'/requirements.txt','w') as req:
req.write(''.join(new_requirements))
P.S: It may have a few additional libraries as it checks on fuzzylogic.
Solution 11 - Python
best way for Python 3 is:
pip3 freeze > requirements.txt
it worked for me...
Solution 12 - Python
If you have installed many dependencies in your system and you need requirements.txt for a specific project, you can install first pipreqs:
$ pip install pipreqs
and execute the below command under the project folder.
$ pipreqs
This command will generate requirements.txt file for the particular project.
Solution 13 - Python
Simple Pythonic Way
To get a list of all the REQUIREMENTS in a standard requirements.txt
file, you can use the following command.
pip freeze > requirements.txt
Now, this should automatically create a standard requirements file with all of the packages installed alongside their corresponding versions.
Pretty Print on Terminal
If you just want to get a pretty print on the terminal you can use the following approach.
pip list
This lists all of the installed packages, in a pretty print format.
Custom Dependency
If you have a project folder like say, a Github Repo, and you want to get a custom requirements.txt for project You can use the following Package.
https://pypi.org/project/pipreqs/ pipreqs
Usage
$ pipreqs /home/project/location
Successfully saved requirements file in /home/project/location/requirements.txt
Contents of requirements.txt
wheel==0.23.0
Yarg==0.1.9
docopt==0.6.2
Solution 14 - Python
Automatic requirements.txt updating approach
While developing a python application with requirements.txt we have several choices:
- Generate requirements.txt after development, when we want to deploy it. It is performed by
pip freeze > requirements.txt
orpipreqs
for less messy result. - Add every module to requirements.txt manually after each install.
- Install manager that will handle requirements.txt updates for us.
There are many answers for the 1-st option, the 2-d option is self-explanatory, so I would like to describe the 3-d approach. There is a library called to-requirements.txt. To install it type this:
pip install to-requirements.txt # Pip install to requirements.txt
If you read the whole command at once you would see, what it does. After installing you should setup it. Run:
requirements-txt setup
It overrides the pip scripts so that each pip install
or pip uninstall
updates the requirements.txt file of your project automatically with required versions of packages. The overriding is made safely, so that after uninstalling this package the pip will behave ordinary.
And you could customize the way it works. For example, disable it globally and activate it only for the required directories, activate it only for git repositories, or allow / disallow to create requirements.txt file if it does not exist.
Links:
Solution 15 - Python
If you want to list only packages used inside a virtualenv use:
pip freeze -l > requirements.txt
Solution 16 - Python
Not a complete solution, but may help to compile a shortlist on Linux.
grep --include='*.py' -rhPo '^\s*(from|import)\s+\w+' . | sed -r 's/\s*(import|from)\s+//' | sort -u > requirements.txt
Solution 17 - Python
I created this bash command.
for l in $(pip freeze); do p=$(echo "$l" | cut -d'=' -f1); f=$(find . -type f -exec grep "$p" {} \; | grep 'import'); [[ ! -z "$f" ]] && echo "$l" ; done;
Solution 18 - Python
@Francis has it right - https://stackoverflow.com/a/65728461/1021819
But just to add:
With additional support for Jupyter notebooks - i.e. .ipynb
files - you can now use https://pypi.org/project/pipreqsnb (same syntax as pipreqs):
pip install pipreqsnb
pipreqs .
[I am not an author]
Solution 19 - Python
Or if your are using a something like virtualenv
you can just run this command to generate a requirements.txt
$ ./.venv/bin/pip freeze > requirements.txt
Solution 20 - Python
Using pip freeze > requirements.txt
is a bad way to create the requirements file! It can serve as a temporary solution for your problem but when managing requirements for python project it is best to do it manually.
A simple search for "import" or "from x import" will give you the list of all dependencies that need to be installed (nothing extra).
The problem with pip freeze
it that it simply dumps all installed packages with strict versions, every dependency has its own dependencies and they are included in the dump.
For example, you have lib==1.0 installed, that needs sub-lib==0.5, if you use pip freeze
you'll get both, but later when you wish to update the version of lib to 2.0, most likely you'll get conflicts since lib v2.0 now uses sub-lib v1.0 not v0.5 that you require... This gets complex fast for multiple dependencies.
We got into those problems in a couple of projects, since then I created an automated script to clean pip freeze
's dumps, it is safe (comments unneeded dependencies) and works great.
Solution 21 - Python
To help solve this problem, always run requirements.txt on only local packages. By local packages I mean packages that are only in your project folder. To do this do: Pip freeze —local > requirements.txt
Not pip freeze > requirements.txt. Note that it’s double underscore before local.
However installing pipreqs helps too. Pip install pipreqs.
The perfect solution though is to have a pipfile. The pipfile updates on its own whenever you install a new local package. It also has a pipfile.lock similar to package.json in JavaScript.
To do this always install your packages with pipenv not pip.
So we do pipenv