Python 3.3 includes in its standard library the new package venv
. What does it do, and how does it differ from all the other packages that seem to match the regex (py)?(v|virtual|pip)?env
?
相关问题
- how to define constructor for Python's new Nam
- streaming md5sum of contents of a large remote tar
- How to get the background from multiple images by
- Evil ctypes hack in python
- Correctly parse PDF paragraphs with Python
I would just avoid the use of
virtualenv
after Python3.3+ and instead use the standard shipped libraryvenv
. To create a new virtual environment you would type:virtualenv
tries to copy the Python binary into the virtual environment's bin directory. However it does not update library file links embedded into that binary, so if you build Python from source into a non-system directory with relative path names, the Python binary breaks. Since this is how you make a copy distributable Python, it is a big flaw. BTW to inspect embedded library file links on OS X, useotool
. For example from within your virtual environment, type:Consequently I would avoid
virtualenvwrapper
andpipenv
.pyvenv
is deprecated.pyenv
seems to be used often wherevirtualenv
is used but I would stay away from it also since I thinkvenv
also does whatpyenv
is built for.venv
creates virtual environments in the shell that are fresh and sandboxed, with user-installable libraries, and it's multi-python safe. Fresh because virtual environments only start with the standard libraries that ship with python, you have to install any other libraries all over again withpip install
while the virtual environment is active. Sandboxed because none of these new library installs are visible outside the virtual environment, so you can delete the whole environment and start again without worrying about impacting your base python install. User-installable libraries because the virtual environment's target folder is created withoutsudo
in some directory you already own, so you won't needsudo
permissions to install libraries into it. Finally it is multi-python safe, since when virtual environments activate, the shell only sees the python version (3.4, 3.5 etc.) that was used to build that virtual environment.pyenv
is similar tovenv
in that it lets you manage multiple python environments. However withpyenv
you can't conveniently rollback library installs to some start state and you will likely needadmin
privileges at some point to update libraries. So I think it is also best to usevenv
.In the last couple of years I have found many problems in build systems (emacs packages, python standalone application builders, installers...) that ultimately come down to issues with
virtualenv
. I think python will be a better platform when we eliminate this additional option and only usevenv
.PyPI packages not in the standard library:
virtualenv
is a very popular tool that creates isolated Python environments for Python libraries. If you're not familiar with this tool, I highly recommend learning it, as it is a very useful tool, and I'll be making comparisons to it for the rest of this answer.It works by installing a bunch of files in a directory (eg:
env/
), and then modifying thePATH
environment variable to prefix it with a custombin
directory (eg:env/bin/
). An exact copy of thepython
orpython3
binary is placed in this directory, but Python is programmed to look for libraries relative to its path first, in the environment directory. It's not part of Python's standard library, but is officially blessed by the PyPA (Python Packaging Authority). Once activated, you can install packages in the virtual environment usingpip
.pyenv
is used to isolate Python versions. For example, you may want to test your code against Python 2.6, 2.7, 3.3, 3.4 and 3.5, so you'll need a way to switch between them. Once activated, it prefixes thePATH
environment variable with~/.pyenv/shims
, where there are special files matching the Python commands (python
,pip
). These are not copies of the Python-shipped commands; they are special scripts that decide on the fly which version of Python to run based on thePYENV_VERSION
environment variable, or the.python-version
file, or the~/.pyenv/version
file.pyenv
also makes the process of downloading and installing multiple Python versions easier, using the commandpyenv install
.pyenv-virtualenv
is a plugin forpyenv
by the same author aspyenv
, to allow you to usepyenv
andvirtualenv
at the same time conveniently. However, if you're using Python 3.3 or later,pyenv-virtualenv
will try to runpython -m venv
if it is available, instead ofvirtualenv
. You can usevirtualenv
andpyenv
together withoutpyenv-virtualenv
, if you don't want the convenience features.virtualenvwrapper
is a set of extensions tovirtualenv
(see docs). It gives you commands likemkvirtualenv
,lssitepackages
, and especiallyworkon
for switching between differentvirtualenv
directories. This tool is especially useful if you want multiplevirtualenv
directories.pyenv-virtualenvwrapper
is a plugin forpyenv
by the same author aspyenv
, to conveniently integratevirtualenvwrapper
intopyenv
.pipenv
, by Kenneth Reitz (the author ofrequests
), is the newest project in this list. It aims to combinePipfile
,pip
andvirtualenv
into one command on the command-line. Thevirtualenv
directory typically gets placed in~/.local/share/virtualenvs/XXX
, withXXX
being a hash of the path of the project directory. This is different fromvirtualenv
, where the directory is typically in the current working directory.The Python Packaging Guide recommends
pipenv
when developing Python applications (as opposed to libraries). There does not seem to be any plans to supportvenv
instead ofvirtualenv
(#15). Confusingly, its command-line option--venv
refers to thevirtualenv
directory, notvenv
, and similarly, the environment variablePIPENV_VENV_IN_PROJECT
affects the location of thevirtualenv
directory, notvenv
directory (#1919).Standard library:
pyvenv
is a script shipped with Python 3 but deprecated in Python 3.6 as it had problems (not to mention the confusing name). In Python 3.6+, the exact equivalent ispython3 -m venv
.venv
is a package shipped with Python 3, which you can run usingpython3 -m venv
(although for some reason some distros separate it out into a separate distro package, such aspython3-venv
on Ubuntu/Debian). It serves a similar purpose tovirtualenv
, and works in a very similar way, but it doesn't need to copy Python binaries around (except on Windows). Use this if you don't need to support Python 2. At the time of writing, the Python community seems to be happy withvirtualenv
and I haven't heard much talk ofvenv
.Most of these tools complement each other. For instance,
pipenv
integratespip
,virtualenv
and evenpyenv
if desired. The only tools that are true alternatives to each other here arevenv
andvirtualenv
.Recommendation for beginners:
This is my personal recommendation for beginners: start by learning
virtualenv
andpip
, tools which work with both Python 2 and 3 and in a variety of situations, and pick up the other tools once you start needing them.Python Docs recommends the use of venv over pyenv. From the docs:
Ref: https://docs.python.org/3/library/venv.html