1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227
|
.. _development-environment:
Setting up and using your development environment
=================================================
Recommended development setup
-----------------------------
Since NumPy contains parts written in C and Cython that need to be
compiled before use, make sure you have the necessary compilers and Python
development headers installed - see :ref:`building-from-source`.
Having compiled code also means that importing NumPy from the development
sources needs some additional steps, which are explained below. For the rest
of this chapter we assume that you have set up your git repo as described in
:ref:`using-git`.
To build the development version of NumPy and run tests, spawn
interactive shells with the Python import paths properly set up etc.,
do one of::
$ python runtests.py -v
$ python runtests.py -v -s random
$ python runtests.py -v -t numpy/core/tests/test_iter.py:test_iter_c_order
$ python runtests.py --ipython
$ python runtests.py --python somescript.py
$ python runtests.py --bench
$ python runtests.py -g -m full
This builds NumPy first, so the first time it may take a few minutes. If
you specify ``-n``, the tests are run against the version of NumPy (if
any) found on current PYTHONPATH.
When specifying a target using ``-s``, ``-t``, or ``--python``, additional
arguments may be forwarded to the target embedded by ``runtests.py`` by passing
the extra arguments after a bare ``--``. For example, to run a test method with
the ``--pdb`` flag forwarded to nose, run the following::
$ python runtests.py -t numpy/tests/test_scripts.py:test_f2py -- --pdb
Using ``runtests.py`` is the recommended approach to running tests.
There are also a number of alternatives to it, for example in-place
build or installing to a virtualenv. See the FAQ below for details.
Building in-place
-----------------
For development, you can set up an in-place build so that changes made to
``.py`` files have effect without rebuild. First, run::
$ python setup.py build_ext -i
This allows you to import the in-place built NumPy *from the repo base
directory only*. If you want the in-place build to be visible outside that
base dir, you need to point your ``PYTHONPATH`` environment variable to this
directory. Some IDEs (Spyder for example) have utilities to manage
``PYTHONPATH``. On Linux and OSX, you can run the command::
$ export PYTHONPATH=$PWD
and on Windows::
$ set PYTHONPATH=/path/to/numpy
Now editing a Python source file in NumPy allows you to immediately
test and use your changes (in ``.py`` files), by simply restarting the
interpreter.
Note that another way to do an inplace build visible outside the repo base dir
is with ``python setup.py develop``. Instead of adjusting ``PYTHONPATH``, this
installs a ``.egg-link`` file into your site-packages as well as adjusts the
``easy-install.pth`` there, so its a more permanent (and magical) operation.
Other build options
-------------------
It's possible to do a parallel build with ``numpy.distutils`` with the ``-j`` option;
see :ref:`parallel-builds` for more details.
In order to install the development version of NumPy in ``site-packages``, use
``python setup.py install --user``.
A similar approach to in-place builds and use of ``PYTHONPATH`` but outside the
source tree is to use::
$ python setup.py install --prefix /some/owned/folder
$ export PYTHONPATH=/some/owned/folder/lib/python3.4/site-packages
Using virtualenvs
-----------------
A frequently asked question is "How do I set up a development version of NumPy
in parallel to a released version that I use to do my job/research?".
One simple way to achieve this is to install the released version in
site-packages, by using a binary installer or pip for example, and set
up the development version in a virtualenv. First install
`virtualenv`_ (optionally use `virtualenvwrapper`_), then create your
virtualenv (named numpy-dev here) with::
$ virtualenv numpy-dev
Now, whenever you want to switch to the virtual environment, you can use the
command ``source numpy-dev/bin/activate``, and ``deactivate`` to exit from the
virtual environment and back to your previous shell.
Running tests
-------------
Besides using ``runtests.py``, there are various ways to run the tests. Inside
the interpreter, tests can be run like this::
>>> np.test()
>>> np.test('full') # Also run tests marked as slow
>>> np.test('full', verbose=2) # Additionally print test name/file
Or a similar way from the command line::
$ python -c "import numpy as np; np.test()"
Tests can also be run with ``nosetests numpy``, however then the NumPy-specific
``nose`` plugin is not found which causes tests marked as ``KnownFailure`` to
be reported as errors.
Running individual test files can be useful; it's much faster than running the
whole test suite or that of a whole module (example: ``np.random.test()``).
This can be done with::
$ python path_to_testfile/test_file.py
That also takes extra arguments, like ``--pdb`` which drops you into the Python
debugger when a test fails or an exception is raised.
Running tests with `tox`_ is also supported. For example, to build NumPy and
run the test suite with Python 3.4, use::
$ tox -e py34
For more extensive info on running and writing tests, see
https://github.com/numpy/numpy/blob/master/doc/TESTS.rst.txt .
*Note: do not run the tests from the root directory of your numpy git repo,
that will result in strange test errors.*
Rebuilding & cleaning the workspace
-----------------------------------
Rebuilding NumPy after making changes to compiled code can be done with the
same build command as you used previously - only the changed files will be
re-built. Doing a full build, which sometimes is necessary, requires cleaning
the workspace first. The standard way of doing this is (*note: deletes any
uncommitted files!*)::
$ git clean -xdf
When you want to discard all changes and go back to the last commit in the
repo, use one of::
$ git checkout .
$ git reset --hard
Debugging
---------
Another frequently asked question is "How do I debug C code inside NumPy?".
The easiest way to do this is to first write a Python script that invokes the C
code whose execution you want to debug. For instance ``mytest.py``::
from numpy import linspace
x = np.arange(5)
np.empty_like(x)
Now, you can run::
$ gdb --args python runtests.py -g --python mytest.py
And then in the debugger::
(gdb) break array_empty_like
(gdb) run
The execution will now stop at the corresponding C function and you can step
through it as usual. With the Python extensions for gdb installed (often the
default on Linux), a number of useful Python-specific commands are available.
For example to see where in the Python code you are, use ``py-list``. For more
details, see `DebuggingWithGdb`_.
Instead of plain ``gdb`` you can of course use your favourite
alternative debugger; run it on the python binary with arguments
``runtests.py -g --python mytest.py``.
Building NumPy with a Python built with debug support (on Linux distributions
typically packaged as ``python-dbg``) is highly recommended.
.. _DebuggingWithGdb: https://wiki.python.org/moin/DebuggingWithGdb
.. _tox: http://tox.testrun.org
.. _virtualenv: http://www.virtualenv.org/
.. _virtualenvwrapper: http://www.doughellmann.com/projects/virtualenvwrapper/
.. _Waf: https://code.google.com/p/waf/
Understanding the code & getting started
----------------------------------------
The best strategy to better understand the code base is to pick something you
want to change and start reading the code to figure out how it works. When in
doubt, you can ask questions on the mailing list. It is perfectly okay if your
pull requests aren't perfect, the community is always happy to help. As a
volunteer project, things do sometimes get dropped and it's totally fine to
ping us if something has sat without a response for about two to four weeks.
So go ahead and pick something that annoys or confuses you about numpy,
experiment with the code, hang around for discussions or go through the
reference documents to try to fix it. Things will fall in place and soon
you'll have a pretty good understanding of the project as a whole. Good Luck!
|