using-python-in-emacs.org
Table of Contents
Description
This layer adds support for the Python language.
Features:
- Auto-completion using anaconda-mode
- Code Navigation using anaconda-mode
- Documentation Lookup using anaconda-mode and pylookup
- Test Runners using nose.el or pytest
- Virtual Environment using pyvenv and pyenv
- semantic mode is enabled
- PEP8 compliant formatting via YAPF
- PEP8 checks with flake8 or pylint
- Suppression of unused import with autoflake
- Use the
%key to jump between blocks with evil-matchit - Sort imports with isort
- Fix a missing import statement with importmagic
- Pip package manager with pippel
Install
Layer
To use this configuration layer, add it to your ~/.spacemacs. You will need to
add python to the existing dotspacemacs-configuration-layers list in this
file.
Dependencies
Auto-completion: Anaconda dependencies
anaconda-mode tries to install the dependencies itself but sometimes
it does not work and you may encounter the following message when
opening a python buffer:
Blocking call to accept-process-output with quit inhibited!!
To fix this, install the anaconda-mode anaconda-deps by hand:
pip install --upgrade "jedi>=0.9.0" "json-rpc>=1.8.1" "service_factory>=0.1.5"If you encounter problems with Jedi 1.0 consider downgrading to 0.9.0. See this issue for details.
Source: https://github.com/proofit404/anaconda-mode#issues
If you are facing errors such as "Unable to run anaconda-mode server", try
setting your PYTHONPATH as explained at
https://github.com/proofit404/anaconda-mode#pythonpath
Syntax checking
Syntax checking uses flake8 package:
pip install flake8Test runner
Both nose and pytest are supported. By default nose is used.
To choose your test runner set the layer variable python-test-runner to
either nose or pytest.
(setq-default dotspacemacs-configuration-layers
'((python :variables python-test-runner 'pytest)))If you need both then you can set python-test-runner to a list like this:
(setq-default dotspacemacs-configuration-layers
'((python :variables python-test-runner '(pytest nose))))This means that pytest is your primary test runner. To use the secondary test
runner you can call the test functions with a prefix argument e.g. SPC u SPC m
t t to run one test with nose.
To set project specific test runners you can set python-test-runner in a
directory local variable in your project root. SPC f v d in Spacemacs. See
the official documentation for more information.
The root of the project is detected with a .git directory or a setup.cfg file.
Automatic buffer formatting on save
To enable automatic buffer formatting on save with YAPF set the variable
python-enable-yapf-format-on-save to t.
(setq-default dotspacemacs-configuration-layers '(
(python :variables python-enable-yapf-format-on-save t)))Automatic save of buffer when testing
By default a buffer is automatically saved before tests are executed upon it,
you can disable this feature by setting python-save-before-test to nil.
(setq-default dotspacemacs-configuration-layers '(
(python :variables python-save-before-test nil)))autoflake
To be able to suppress unused imports easily, install autoflake:
pip install autoflakepylookup
To use pylookup on SPC m h H, make sure you update the database first, using
SPC SPC pylookup-update.
Hy-mode
To be able to connect to an inferior lisp repl in hy-mode, you need to make sure
that hy is installed.
pip install hyConfiguration
Fill column
If you want to customize the fill column value, use something like this inside
the user-init function in your .spacemacs:
(setq-default dotspacemacs-configuration-layers '(
(python :variables python-fill-column 99)))Sort imports
If you want imports to be automatically sorted when you save a file (using
isort), set the python-sort-imports-on-save variable in the python layer
config section:
(setq-default dotspacemacs-configuration-layers
'((python :variables python-sort-imports-on-save t)))or as a directory-local variable (for per-project settings).
Management of Python versions and virtual environments
Manage virtual environments with pyvenv
A virtual environment provides isolation of your Python package versions. For a
general overview see this site. Virtualenvwrapper which is also explained in the
previous link, is a program which manages your virtual environments in a central
location set by the WORKON_HOME environment variable.
Spacemacs integration of virtual environments and virtualenvwrapper is provided by the pyvenv package. It provides the following keybindings:
| Key Binding | Description |
|---|---|
SPC m V a | 激活任何目录下的虚拟环境 activate a virtual environment in any directory |
SPC m V d | 停止虚拟环境 deactivate active virtual environment |
SPC m V w | 在 WORKON 目录工作 work on virtual environment in WORKON_HOME |
Manage multiple Python versions with pyenv
If you need multiple Python versions (e.g. Python 2 and Python 3) then take a look at pyenv. It enables the installation and managment of multiple Python versions. This blogpost gives a good overview on how to use the tool. Spacemacs integration is provided by pyenv mode which has the following keybindings.
| Key Binding | Description |
|---|---|
SPC m v s | set a pyenv environment with pyenv |
SPC m v u | unset a pyenv environment with pyenv |
Pyenv can also manage virtual environments for each of the Python versions it has installed. Those will be listed alongside your Python versions.
Automatic activation of local pyenv version
A project-specific pyenv version may be written to a file called
.python-version using the pyenv local command.
Spacemacs can search in parent directories for this file, and automatically set
the pyenv version. The behavior can be set with the variable
python-auto-set-local-pyenv-version to:
on-visit(default) set the version when you visit a python buffer,on-project-switchset the version when you switch projects,nilto disable.
The same is also possible on pyvenv with a file called .venv. The behavior
can be set with the variable python-auto-set-local-pyvenv-virtualenv= to:
on-visit(default) set the virtualenv when you visit a python buffer,on-project-switchset the virtualenv when you switch projects,nilto disable.
Key Bindings
Inferior REPL process
Start a Python or iPython inferior REPL process with SPC m s i.
If ipython is available in system executable search paths, ipython
will be used to launch python shell; otherwise, default python
interpreter will be used. You may change your system executable
search path by activating a virtual environment.
Send code to inferior process commands:
| Key Binding | Description |
|---|---|
SPC m s b | send buffer and keep code buffer focused |
SPC m s B | send buffer and switch to REPL in insert mode |
SPC m s f | send function and keep code buffer focused |
SPC m s F | send function and switch to REPL in insert mode |
SPC m s i | start inferior REPL process |
SPC m s r | send region and keep code buffer focused |
SPC m s R | send region and switch to REPL in insert mode |
CTRL+j | next item in REPL history |
CTRL+k | previous item in REPL history |
Running Python Script in shell
To run a Python script like you would in the shell press SPC m c c
to start the Python script in comint mode. This is useful when working with
multiple Python files since the REPL does not reload changes made in other
modules.
| Key Binding | Description |
|---|---|
SPC m c c | Execute current file in a comint shell |
SPC m c C | Execute current file in a comint shell and switch to it in insert state |
Note: With the universal argument SPC u you can enter a new
compilation command.
Testing
Test commands start with m t. To use the secondary test runner call the
function with a prefix argument, for example SPC u SPC m t a.
| No Debug | Description |
|---|---|
SPC m t a | launch all tests of the project |
SPC m t b | launch all tests of the current buffer (same as module) |
SPC m t m | launch all tests of the current module |
SPC m t s | launch all tests of the current suite (only with nose) |
SPC m t t | launch the current test (function) |
| Debug | Description |
|---|---|
SPC m t A | launch all tests of the project in debug mode |
SPC m t B | launch all tests of the current buffer (module) in debug mode |
SPC m t M | launch all tests of the current module in debug mode |
SPC m t S | launch all tests of the current suite in debug mode (only with nose) |
SPC m t T | launch the current test (function) in debug mode |
Refactoring
| Key Binding | Description |
|---|---|
SPC m r f | fix a missing import statement with importmagic |
SPC m r i | remove unused imports with autoflake |
SPC m r I | sort imports with isort |
Pip package management
In python buffer type SPC m P to open buffer listing all installed pip
packages in the currently activated virtual environment.
Note: To open this menu from outside a python buffer type
SPC SPC pippel-list-packages RET .
In the package list buffer:
| Key Binding | Description |
|---|---|
RET | follow link (pippel-menu-visit-homepage) |
d | mark for deletion (pippel-menu-mark-delete) |
i | prompt user for packages (pippel-install-package) |
m | remove mark (pippel-menu-mark-unmark) |
r | refresh package list (pippel-list-packages) |
U | mark all upgradable (pippel-menu-mark-all-upgrades) |
u | mark for upgrade (pippel-menu-mark-upgrade) |
x | perform marked package menu actions (pippel-menu-execute) |
Live coding
Live coding is provided by the live-py-plugin.
| Key Binding | Description |
|---|---|
SPC m l | Toggle live-py-mode |
Hy REPL process
Start a Hy inferior repel process with SPC m s i. If hy is
available in system executable search paths, hy will be used to
launch the shell. You may change your system executable search path
by activating a virtual enviornment.
Send code to hy REPL commands:
| Key Binding | Description |
|---|---|
SPC m s b | send buffer and keep code buffer focused |
SPC m s B | switch to REPL |
SPC m s e | send sexp in front of the cursor to the REPL |
SPC m s f | send function to REPL and stay in buffer |
SPC m s F | send function to REPL and switch to repl buffer |
SPC m s i | start inferior hy repl |
SPC m s r | send current region to the REPL and stay in buffer |
SPC m s R | send current region to the REPL and switch to repl buffer |
Other Python commands
| Key Binding | Description |
|---|---|
SPC m = | Reformat the buffer according to PEP8 using YAPF |
SPC m d b | toggle a breakpoint using wdb, ipdb, pudb or pdb |
SPC m g g | go to definition using anaconda-mode-find-definitions (C-o to jump back) |
SPC m g a | go to assignment using anaconda-mode-find-assignments (C-o to jump back) |
SPC m g b | jump back |
SPC m g u | navigate between usages with anaconda-mode-find-references |
SPC m h d | look for documentation using helm-pydoc |
SPC m h h | quick documentation using anaconda |
SPC m h H | open documentation in firefox using pylookup |
SPC m v s | set a pyenv environment with pyenv |
SPC m v u | unset a pyenv environment with pyenv |
SPC m V w | work on virtual environment in WORKON_HOME |
SPC m V a | activate a virtual environment in any directory |
SPC m V d | deactivate active virtual environment |