Как использовать файл requirements.txt в Python

Вы когда-нибудь тратили много часов на отладку программы на Python, чтобы в итоге обнаружить, что вы не установили все необходимые модули?

В этом уроке мы узнаем, как решить эту проблему, используя файл Python requirements.txt.

Что входит в файл requirements.txt?

Python — это язык, который сильно зависит от модулей. Например, если вы установите неправильную версию одного из модулей, необходимых вашей программе Python, вы можете столкнуться с проблемами при запуске вашей программы.

Вот здесь-то и проявляется вся роль файла Python requirements.txt.

Файл requirements.txt в Python хранит все модули и пакеты, установленные в проекте Python, с их версиями. Он позволяет людям, читающим код проекта Python, узнать, какие модули необходимы для выполнения проекта. А также упрощает установку модулей, необходимых для проекта.

Мы увидим, что можно быстро установить и обновить все модули и пакеты, указанные в файле требований, с помощью одной команды.

Умение создавать и читать файл требований на Python является обязательным для каждого программиста, и в этом уроке мы взломаем файл requirements.txt!

Прежде чем приступить к работе с этим руководством, создайте на своем компьютере каталог и внутри него простую программу Python под названием requirements_test.py, содержащую следующий код:

import numpy as np
import pandas as pd
from sklearn.preprocessing import StandardScaler

# create a 3x3 array with numpy
X_train = np.array([[ 1., -1.,  2.],
                    [ 2.,  0.,  0.],
                    [ 0.,  1., -1.]])

# fit this array to StandardScaler
scaler = StandardScaler().fit(X_train)

# transform X_train with this scaler
X_scaled = scaler.transform(X_train)

# Finally, convert this scaled array into a pandas dataframe
df = pd.DataFrame(X_scaled)

# Print the dataframe
print(df)

Как создать файл Python requirements.txt?

В Python файл requirements.txt обычно используется в виртуальной среде. Перед созданием файла requirements.txt мы узнаем, как создать виртуальную среду.

Сначала откройте терминал и установите модуль virtualenv с помощью Pip.

pip install virtualenv

Затем давайте создадим виртуальную среду с именем. sample_env в том же каталоге нашей программы Python, используя следующую команду:

python -m venv.sample_env

На этом этапе вы видите, что .sample_env был создан в текущем рабочем каталоге.

Активация виртуальной среды может различаться в зависимости от операционной системы. В Windows можно использовать следующее:

.sample_env\Scripts\activate

тогда как в Linux или macOS вам необходимо выполнить команду:

..sample_env/bin/activate

Вы можете убедиться, что виртуальная среда .sample_env активирована, поскольку после префикса командной строки вы увидите .(sample_env), как показано ниже:

$..sample_env/bin/activate
(.sample_env) # 

Перед выполнением программы, которую мы создали в первой части, не забудьте установить модули с помощью команды:

pip install module_name

В этом случае, теперь, когда наша виртуальная среда активна, нам нужно выполнить следующие команды одну за другой:

pip install numpy 
pip install pandas 
pip install sklearn

Теперь вы можете выполнить программу Python, которую мы создали в начале этого урока:

(.sample_env) # python requirements_test.py                 
          0         1         2
0  0.000000 -1.224745  1.336306
1  1.224745  0.000000 -0.267261
2 -1.224745  1.224745 -1.069045

Теперь мы готовы перейти к созданию файла требований. Команда pip3 freeze покажет нам установленные модули с их версиями.

Мы можем перенаправить вывод команды pip3 freeze в файл requirements.txt с помощью символа «>»:

pip3 freeze > requirements.txt

Убедитесь, что список модулей, требуемых нашим примером программы Python, находится внутри файла requirements.txt.

Вот список модулей, которые я вижу в файле requirements.txt:

joblib==1.2.0
numpy==1.23.4
pandas==1.5.1
python-dateutil==2.8.2
pytz==2022.5
scikit-learn==1.1.3
scipy==1.9.3
six==1.16.0
sklearn==0.0
threadpoolctl==3.1.0

Мы только что создали файл требований со всей информацией, необходимой для выполнения нашей программы.

Команда pip3 freeze также перечисляет модули, от которых зависят основные модули. Модули Pandas, NumPy и scikit-learn зависят от других модулей, которые мы также видим в файле требований.

Позже мы увидим, как с помощью pipreqs можно вывести список только тех модулей, которые мы импортировали в проект!

Примечание: файл требований необходим для вашего проекта, поэтому не забудьте зафиксировать и отправить файл требований в репозиторий кода в системе контроля версий.

Как добавить модуль Python в файл requirements.txt

Первый способ добавления модулей Python в файл требований — это, конечно, редактирование файла requirements.txt. Затем вы можете вручную добавлять модули с их версиями в файл.

Однако этот метод не рекомендуется, поскольку он подвержен ошибкам и может быть сложным в управлении, если в проект Python импортировано много модулей.

Вместо этого мы представим pipreqs, который автоматически просканирует проект и выведет для вас список всех модулей и их версий!

Сначала установите pipreqs:

pip install pipreqs

Затем запустите pipreqs для текущего рабочего каталога, в котором находится наша программа Python.

pipreqs . --ignore .sample_env --force

Обратите внимание, что мы используем флаг --ignore, поэтому убедитесь, что pipreqs игнорирует каталог виртуальной среды.

Кроме того, мы передаем флаг --force, чтобы перезаписать его новым файлом требований.

Затем вы увидите новый файл requirements.txt, созданный в текущем каталоге, после того как увидите следующий вывод в командной строке:

INFO: Successfully saved requirements file in./requirements.txt

Вы можете продолжить и проверить, что файл requirements.txt, созданный в вашей папке, содержит имена и версии модулей.

На моем компьютере файл requirements.txt выглядит так:

numpy==1.23.4
pandas==1.5.1
scikit_learn==1.1.3

Обратите внимание, что названия версий могут отличаться, если вы реализуете это руководство в другой системе.

А если вы не используете флаг --force и файл требований уже существует, вы увидите следующую ошибку:

WARNING: requirements.txt already exists, use --force to overwrite it

Здесь стоит отметить некоторые различия между pip freeze и pipreqs.

В то время как команда pip freeze выводит список только тех пакетов, которые установлены с помощью команды pip, pipreqs не имеет такого ограничения.

Еще одно отличие заключается в том, что pip freeze сохраняет все пакеты независимо от того, используются ли они в проекте, тогда как pipreqs показывает только те пакеты, которые импортированы в проект.

Как установить модули Python с помощью Pip и requirements.txt

Освоив процесс создания файла требований, теперь мы разберемся, как установить модули Python, указанные в нашем файле требований.

Помните, что вы можете установить модуль с помощью команды pip install:

pip install module_name

Но учитывая, что мы создали файл requirements.txt, мы можем просто передать его в pip и установить все модули одной командой:

pip install -r requirements.txt

Давайте сделаем следующее, чтобы протестировать установку модулей с использованием файла требований:

  • деактивируйте виртуальную среду.
  • удалите каталог виртуальной среды.
  • воссоздать виртуальную среду.
  • активируйте новую виртуальную среду.
(.sample_env) # deactivate
$ rm -fr.sample_env
$ python -m venv.sample_env
$..sample_env/bin/activate

После выполнения программы Python вы увидите следующую ошибку:

(.sample_env) # python requirements_test.py 
Traceback (most recent call last):
  File "requirements_test.py", line 1, in <module>
    import numpy as np
ModuleNotFoundError: No module named 'numpy'

Ошибка ModuleNotFoundError возникает из-за того, что модуль NumPy еще не установлен.

Теперь выполните команду для установки всех модулей, от которых зависит наша программа Python, используя файл requirements.txt.

(.sample_env) # pip install -r requirements.txt
Collecting numpy==1.23.4
  Using cached numpy-1.23.4-cp38-cp38-macosx_10_9_x86_64.whl (18.1 MB)
Collecting pandas==1.5.1
  Using cached pandas-1.5.1-cp38-cp38-macosx_10_9_x86_64.whl (11.9 MB)
Collecting scikit_learn==1.1.3
  Using cached scikit_learn-1.1.3-cp38-cp38-macosx_10_9_x86_64.whl (8.6 MB)
Collecting python-dateutil>=2.8.1
  Using cached python_dateutil-2.8.2-py2.py3-none-any.whl (247 kB)
Collecting pytz>=2020.1
  Using cached pytz-2022.5-py2.py3-none-any.whl (500 kB)
Collecting scipy>=1.3.2
  Using cached scipy-1.9.3-cp38-cp38-macosx_10_9_x86_64.whl (34.2 MB)
Collecting joblib>=1.0.0
  Using cached joblib-1.2.0-py3-none-any.whl (297 kB)
Collecting threadpoolctl>=2.0.0
  Using cached threadpoolctl-3.1.0-py3-none-any.whl (14 kB)
Collecting six>=1.5
  Using cached six-1.16.0-py2.py3-none-any.whl (11 kB)
Installing collected packages: numpy, six, python-dateutil, pytz, pandas, scipy, joblib, threadpoolctl, scikit-learn
Successfully installed joblib-1.2.0 numpy-1.23.4 pandas-1.5.1 python-dateutil-2.8.2 pytz-2022.5 scikit-learn-1.1.3 scipy-1.9.3 six-1.16.0 threadpoolctl-3.1.0

Модули успешно установлены.

Теперь давайте выполним нашу тестовую программу:

(.sample_env) # python requirements_test.py
          0         1         2
0  0.000000 -1.224745  1.336306
1  1.224745  0.000000 -0.267261
2 -1.224745  1.224745 -1.069045

Оно работает!

Заключение

В этом уроке мы узнали, какую важную роль файл requirements.txt играет в Python. В Python важно знать, какие модули и версии используются в проекте, и файл requirements.txt отслеживает эту информацию.

Мы также узнали, как создать файл требований и как установить все модули и пакеты в файле требований с помощью одной команды.

Автор

Фото аватара

Владимир Михайлов

Программист на Python с большим количеством опыта и разнообразных проектов.