Virtualenv allows you to create a repeatable, isolated environment for your project and its dependencies, without worrying about what packages and versions are installed globally on your development machine. This is a standard tool for most python projects, but since arcpy is installed as a separate, global package, using virtual environments is a little more difficult.
There are a couple of approaches to tackling this problem; either adding a .pth file to the local virtualenv, or by using the --system-site-packages
flag. Both of these have some disadvantages–the first requires manual modification of the virtual environment and storing the .pth
file separately, and the second brings in all the global dependencies into your virtual environment.
A third possibility is to use the site module, which will allow us to selectively expose global packages to all of our virtual environments; this is the approach we’ll take.
Installing
Virtualenv is included in the standard library at 3.3, but if you’re still using python 2.7, you’ll need to install it separately:
pip install virtualenv
Customizing Site Packages
Since arcpy
is installed globally and isn’t available as an independent package, we need to allow access to it in our virtual environment. We can do this by creating a sitecustomize.py
file; this will allow us to specify a subset of the globally installed packages, and that subset will be included in every virtual environment we create. At a minimum, we need arcpy and numpy, but you can add additional packages if you need to.
First we’ll create a directory to hold our subset; it doesn’t matter where we put it or what its called, but for this example, it will be C:/Python27/ArcGIS10.5/arcpy_includes
.
We can add the required arcpy directories by copying the global Desktop10.5.pth
file; this is just a list of directories for python to search, and it looks like this:
C:\Program Files (x86)\ArcGIS\Desktop10.5\bin
C:\Program Files (x86)\ArcGIS\Desktop10.5\ArcPy
C:\Program Files (x86)\ArcGIS\Desktop10.5\ArcToolBox\Scripts
To handle numpy, we create a link (mklink
from a windows cmd
shell, ln
from gitbash) to the global directory; putting it all together, it looks like this:
cd c:/Python27/ArcGIS10.5
mkdir arcpy_includes
cd arcpy_includes
cp c:/Python27/ArcGIS10.5/Lib/site-packages/Desktop10.5.pth ./
ln -s c:/Python27/ArcGIS10.5/Lib/site-packages/numpy numpy
Once this is done, our arcpy_includes
directory should look like:
$ ls
Desktop10.5.pth numpy/
Now we create a file called sitecustomize.py
, in C:/Python27/ArcGIS10.5/Lib
(note that the documentation recommends placing sitecustomize.py
in the global Lib/site-packages
directory, but virtualenv won’t be able to find it there). The contents of the file are short:
import site
site.addsitedir('c:/Python27/ArcGIS10.5/arcpy_includes')
And that’s it–now arcpy and numpy will be included in every virtual environment we create.
Using the Virtual Environment
To use the virtual environment in a project, just navigate to your project directory; the first time around, we need to create the virtual environment–by convention, we’ll put in a local folder called venv
. We may also want to to tell virtualenv
which version of python to use; it’s often the case that we’ll have multiple versions installed, especially if we’ve upgraded ArcGIS. We can do that using the --python
flag:
virtualenv --python C:/Python27/ArcGIS10.5/python.exe venv
Once the virtual environment is created, we activate it (from a cmd
shell, you don’t need the source
command):
source venv/Scripts/activate
Now any additional dependencies we install will only be installed to our local virtual environment, and not pollute the global site-packages. To deactivate the environment, just do:
deactivate