It's been about half a year since I first learned about Pipenv
and started using it.
I will summarize what I thought was convenient.
To put it simply, Pipenv
is convenient, so everyone should try it.
Until I learned about the existence of Pipenv
, I used venv
to create a virtual environment and managed the modules listed in requirements.txt
by installing them with pip
.
requirements.txt
requests==2.22.0
Prepare such a file
$ python3 -m venv venv
$ ./venv/bin/python -m pip install -r requirements.txt
Collecting requests==2.22.0 (from -r requirements.txt (line 1))
Using cached https://files.pythonhosted.org/packages/51/bd/23c926cd341ea6b7dd0b2a00aba99ae0f828be89d72b2190f27c11d4b7fb/requests-2.22.0-py2.py3-none-any.whl
Collecting idna<2.9,>=2.5 (from requests==2.22.0->-r requirements.txt (line 1))
Using cached https://files.pythonhosted.org/packages/14/2c/cd551d81dbe15200be1cf41cd03869a46fe7226e7450af7a6545bfc474c9/idna-2.8-py2.py3-none-any.whl
Collecting certifi>=2017.4.17 (from requests==2.22.0->-r requirements.txt (line 1))
Using cached https://files.pythonhosted.org/packages/b9/63/df50cac98ea0d5b006c55a399c3bf1db9da7b5a24de7890bc9cfd5dd9e99/certifi-2019.11.28-py2.py3-none-any.whl
Collecting urllib3!=1.25.0,!=1.25.1,<1.26,>=1.21.1 (from requests==2.22.0->-r requirements.txt (line 1))
Using cached https://files.pythonhosted.org/packages/b4/40/a9837291310ee1ccc242ceb6ebfd9eb21539649f193a7c8c86ba15b98539/urllib3-1.25.7-py2.py3-none-any.whl
Collecting chardet<3.1.0,>=3.0.2 (from requests==2.22.0->-r requirements.txt (line 1))
Using cached https://files.pythonhosted.org/packages/bc/a9/01ffebfb562e4274b6487b4bb1ddec7ca55ec7510b22e4c51f14098443b8/chardet-3.0.4-py2.py3-none-any.whl
Installing collected packages: idna, certifi, urllib3, chardet, requests
Successfully installed certifi-2019.11.28 chardet-3.0.4 idna-2.8 requests-2.22.0 urllib3-1.25.7
Something like this.
If you want to execute code in this environment, you can either source ./venv/bin/activate
or specify ./venv/bin/python
directly.
There were some problems with the management of modules so far.
requirements.txt
requests==2.22.0
At first, I was worried that the version of the dependent module could not be fixed with this way of writing requirements.txt
.
However, the pip
command has a subcommand called freeze
, which outputs all currently installed modules in a format that can be described in requirements.txt
.
As a result, my requirements.txt
looks like this.
requirements.txt
certifi==2019.11.28
chardet==3.0.4
idna==2.8
pkg-resources==0.0.0
requests==2.22.0
urllib3==1.25.7
Now you can specify the version of all dependent modules! But the big problem here is
** I don't know the module dependencies at all **
As I will explain later, in this respect I have become a body that Pipenv
cannot part with.
The current requirements.txt
just lists all the modules that will be installed, so I don't see any dependencies on each.
Also, depending on the project, the files are separated into dev-requirements.txt
and build-requirements.txt
(as was the case with the project I am developing).
I had a hard time trying to give one version of the module. I don't know which package it depends on, so I installed it in another environment and checked the dependent packages.
Until I created the virtual environment and ran the code, I had the following steps:
$ python3 -m venv venv #Create virtual environment
$ ./venv/bin/pip install -U setuptools pip wheel #Update the basic module to the latest version
$ ./venv/bin/pip install -r requirements.txt #Installation of required modules
$ ./venv/bin/python main.py #Code execution in a virtual environment
What! It would be nice to keep the venv environment once created, but that is not the case.
I use Makefile
to make this possible with a single command.
Makefile
venv:
python3 -m venv venv
./venv/bin/pip install -U setuptools pip wheel
./venv/bin/pip install -r requirements.txt
.PHONY: run
run:
${MAKE} venv
./venv/bin/python main.py
Now you can run the code with make run
at any time.
One day I met Pipenv
. .. ..
https://pipenv-ja.readthedocs.io/ja/translate-ja/
The official documentation for Pipenv
is very good. It's Japanese and easy to read.
Personally, this was a great help.
You can see the function of Pipenv
by looking at the official documentation.
Here, try using Pipenv
and use the management method so far.
Here are some of the features that I found useful.
It is no exaggeration to say that I wrote this article because I wanted to say this.
I won't go into detail here, but Pipenv
manages modules in a file called Pipfile
instead of requirements.txt
.
This file is automatically generated when you run the pipenv
command, so you may not have a chance to edit it directly.
Pipfile
[[source]]
name = "pypi"
url = "https://pypi.org/simple"
verify_ssl = true
[dev-packages]
[packages]
requests = "==2.22.0"
[requires]
python_version = "3.6"
Now try running the command pipenv graph
.
$ pipenv graph
requests==2.22.0
- certifi [required: >=2017.4.17, installed: 2019.11.28]
- chardet [required: >=3.0.2,<3.1.0, installed: 3.0.4]
- idna [required: >=2.5,<2.9, installed: 2.8]
- urllib3 [required: >=1.21.1,<1.26,!=1.25.1,!=1.25.0, installed: 1.25.7]
** Not only can you check the installed modules, but you can also see the dependencies of each. ** ** This was personally most appreciated.
Since you can see the version required for each module, you do not have to check the dependencies each time you want to change the version.
If you are using Pipenv
, you can create a virtual environment → install necessary modules → execute code in the virtual environment with the following command.
$ pipenv install #Creating a virtual environment+Installation of required modules
$ pipenv run python main.py #Main in virtual environment.Run py
The number of commands is clearly reduced compared to the procedure introduced in [Troublesome to execute code](#Troublesome to execute code).
With this amount, you don't have to bother to use Makefile
.
By defining a section called scripts
in Pipfile
, you can define frequently executed statements as commands.
Click here for details (https://pipenv-ja.readthedocs.io/ja/translate-ja/advanced.html#custom-script-shortcuts) (Official)
For example, the Pipfile
that defines the command to execute the test is as follows.
Pipfile
[[source]]
name = "pypi"
url = "https://pypi.org/simple"
verify_ssl = true
[dev-packages]
pytest = "==5.3.1"
[packages]
requests = "==2.22.0"
[requires]
python_version = "3.6"
[scripts]
test = "python -m pytest tests/"
A section called [scripts]
has been added.
It allows you to define a subcommand that follows the pipenv run
command, in which case the pipenv run test
will run the test with the pytest
.
Frequently used commands such as test execution and packaging were described in Makefile
, but if you use this, you only need one Pipfile
to execute simple code.
When you run the code with pipenv run
, it will automatically load the .env
file.
Click here for details (https://pipenv-ja.readthedocs.io/ja/translate-ja/advanced.html#automatic-loading-of-env) (Official)
This is also sober.
I use this function like a configuration file.
Write the value in the .env
file in the format key = value
so that the code reads the value from the environment variable.
.env
KEY=VALUE
main.py
import os
key = os.environ.get("KEY")
print(key) # VALUE
Just like the configuration file, just editing the file in .env
will change the execution result.
$ pipenv run python main.py
VALUE
If the scale of the code becomes large, it is better to create a mechanism to read the configuration file properly,
This function is very helpful because it is troublesome to write the code to read the configuration file by using ConfigParser
etc. for small code.
If you are using Python
and have never heard of Pipenv
, please try it.
Recommended Posts