Setting up and using your development environment¶
Recommended development setup¶
由于NumPy包含使用C和Cython编写的需要在使用前编译的部分,请确保您已经安装了必要的编译器和Python开发标题 - 参见Building from source。
编译代码也意味着从开发源导入NumPy需要一些额外的步骤,这将在下面解释。对于本章的其余部分,我们假设你已经设置了你的git repo,如Working with NumPy source code中所述。
要构建NumPy的开发版本并运行测试,生成交互式shell与Python导入路径正确设置等,执行以下操作之一:
$ 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
这首先构建NumPy,所以第一次可能需要几分钟。如果您指定-n
,则会针对在当前PYTHONPATH上找到的NumPy版本(如果有)运行测试。
当使用-s
,-t
或--python
指定目标时,可以将附加参数转发到runtests.py
,将额外的参数传递到裸元素--
之后。例如,要运行将--pdb
标志转发给nose的测试方法,请运行以下命令:
$ python runtests.py -t numpy/tests/test_scripts.py:test_f2py -- --pdb
使用runtests.py
是推荐的运行测试的方法。还有一些替代方法,例如就地构建或安装到virtualenv。有关详细信息,请参阅下面的常见问题。
Building in-place¶
对于开发,您可以设置一个就地构建,以使对.py
文件的更改生效,无需重建。首先,运行:
$ python setup.py build_ext -i
这允许你从repo基目录只导入就地构建的NumPy 。如果你想要就地构建在基本目录外部可见,那么你需要将PYTHONPATH
环境变量指向此目录。某些IDE(例如Spyder)具有管理PYTHONPATH
的实用程序。在Linux和OSX上,您可以运行命令:
$ export PYTHONPATH=$PWD
和在Windows上:
$ set PYTHONPATH=/path/to/numpy
现在,在NumPy中编辑Python源文件允许您立即测试和使用您的更改(在.py
文件),只需重新启动解释器。
请注意,在repo base dir之外执行inplace build的另一种方法是使用python setup.py 开发 。
不是调整PYTHONPATH
,它会在您的网站软件包中安装.egg-link
文件,并调整easy-install.pth
,所以它更持久(和神奇)的操作。
Other build options¶
可以使用numpy.distutils
和-j
选项进行并行构建;有关详细信息,请参阅Parallel builds。
要在site-packages
中安装NumPy的开发版本,请使用python setup.py 安装 t5 > - user
。
类似的方法是原位构建和使用PYTHONPATH
,但在源代码树外部使用:
$ python setup.py install --prefix /some/owned/folder
$ export PYTHONPATH=/some/owned/folder/lib/python3.4/site-packages
Using virtualenvs¶
一个常见的问题是“如何在发布的版本中并行地设置NumPy的开发版本,以用于我的工作/研究?
实现这一点的一个简单的方法是通过使用二进制安装程序或pip例如在site-packages中安装发布的版本,并在virtualenv中设置开发版本。首先安装virtualenv(可选使用virtualenvwrapper),然后使用以下命令创建virtualenv(此处命名为numpy-dev)
$ 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¶
除了使用runtests.py
,还有多种方法来运行测试。在解释器中,测试可以这样运行:
>>> np.test()
>>> np.test('full') # Also run tests marked as slow
>>> np.test('full', verbose=2) # Additionally print test name/file
或者从命令行类似的方式:
$ python -c "import numpy as np; np.test()"
测试也可以使用nosetests numpy
运行,但是没有找到NumPy特定的nose
标记为KnownFailure
的测试将报告为错误。
运行单个测试文件可能很有用;它比运行整个测试套件或整个模块(例如:np.random.test()
)要快得多。这可以通过:
$ python path_to_testfile/test_file.py
这也需要额外的参数,例如--pdb
,当测试失败或引发异常时,会将您拖入Python调试器。
还支持使用tox运行测试。例如,要构建NumPy并使用Python 3.4运行测试套件,请使用:
$ tox -e py34
有关运行和编写测试的更多信息,请参阅https://github.com/numpy/numpy/blob/master/doc/TESTS.rst.txt。
注意:不要从您的numpy git仓库的根目录运行测试,这将导致奇怪的测试错误。
Rebuilding & cleaning the workspace¶
在对编译代码进行更改之后重新构建NumPy可以使用与之前使用的相同的构建命令来完成 - 只有重新构建已更改的文件。执行完全构建(有时是必要的)需要先清洁工作区。执行此操作的标准方法是(注意:删除任何未提交的文件!):
$ git clean -xdf
当你想丢弃所有的更改并返回到repo中的最后一个提交时,使用以下方法之一:
$ git checkout .
$ git reset --hard
Debugging¶
另一个常见问题是“如何调试NumPy中的C代码?”。最简单的方法是首先编写一个Python脚本,调用要调试的C代码。例如mytest.py
:
from numpy import linspace
x = np.arange(5)
np.empty_like(x)
现在,你可以运行:
$ gdb --args python runtests.py -g --python mytest.py
然后在调试器中:
(gdb) break array_empty_like
(gdb) run
执行现在将停止在相应的C函数,你可以像往常一样通过它。通过安装gdb的Python扩展(通常是Linux上的默认),可以使用许多有用的Python特定命令。例如,要看看你在Python代码中的位置,使用py-list
。有关更多详细信息,请参阅DebuggingWithGdb。
你可以使用你最喜欢的替代调试器,而不是普通的gdb
使用参数runtests.py -g - python mytest.py
。
强烈建议使用构建有调试支持的Python(在Linux发行版通常打包为python-dbg
)构建NumPy。
Understanding the code & getting started¶
更好地理解代码基础的最好的策略是选择你想要改变的东西,并开始阅读代码来弄清它是如何工作的。如有疑问,您可以在邮件列表上提出问题。这是完全没有问题,如果你的请求不完美,社区总是乐意提供帮助。作为一个志愿者项目,事情有时会被丢弃,如果一些事情在没有回应的情况下持续大约两到四个星期,我们可以告诉我们。
所以,继续选择一些东西,恼人或困惑你对numpy,实验的代码,挂起讨论或通过参考文档,尝试解决它。事情会落到位,很快你会对整个项目有一个很好的理解。祝你好运!