2021-01-01 09:45:43 -08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								# Python {#python}
 
							 
						 
					
						
							
								
									
										
										
										
											2016-02-21 20:13:44 +01:00 
										
									 
								 
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								## User Guide
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								### Using Python
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-08-26 11:21:30 +02:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								#### Overview
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								Several versions of the Python interpreter are available on Nix, as well as a
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								high amount of packages. The attribute `python`  refers to the default
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								interpreter, which is currently CPython 2.7. It is also possible to refer to
							 
						 
					
						
							
								
									
										
										
										
											2020-05-09 12:58:00 -04:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								specific versions, e.g. `python38`  refers to CPython 3.8, and `pypy`  refers to
							 
						 
					
						
							
								
									
										
										
										
											2017-08-26 11:21:30 +02:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								the default PyPy interpreter.
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								Python is used a lot, and in different ways. This affects also how it is
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								packaged. In the case of Python on Nix, an important distinction is made between
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								whether the package is considered primarily an application, or whether it should
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								be used as a library, i.e., of primary interest are the modules in
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								`site-packages`  that should be importable.
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								In the Nixpkgs tree Python applications can be found throughout, depending on
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								what they do, and are called from the main package set. Python libraries,
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								however, are in separate sets, with one set per interpreter version.
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								The interpreters have several common attributes. One of these attributes is
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								`pkgs` , which is a package set of Python libraries for this specific
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								interpreter. E.g., the `toolz`  package corresponding to the default interpreter
							 
						 
					
						
							
								
									
										
										
										
											2020-05-09 12:58:00 -04:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								is `python.pkgs.toolz` , and the CPython 3.8 version is `python38.pkgs.toolz` .
							 
						 
					
						
							
								
									
										
										
										
											2017-08-26 11:21:30 +02:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								The main package set contains aliases to these package sets, e.g.
							 
						 
					
						
							
								
									
										
										
										
											2020-05-09 12:58:00 -04:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								`pythonPackages`  refers to `python.pkgs`  and `python38Packages`  to
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								`python38.pkgs` .
							 
						 
					
						
							
								
									
										
										
										
											2017-08-26 11:21:30 +02:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2016-02-21 20:13:44 +01:00 
										
									 
								 
							 
							
								
							 
							
								 
							 
							
							
								#### Installing Python and packages
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-08-26 11:21:30 +02:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								The Nix and NixOS manuals explain how packages are generally installed. In the
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								case of Python and Nix, it is important to make a distinction between whether the
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								package is considered an application or a library.
							 
						 
					
						
							
								
									
										
										
										
											2016-02-21 20:13:44 +01:00 
										
									 
								 
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
											 
										 
										
											
												doc: Rewrite python onboarding tutorials in manual
Based on some feedback in #87094 and discussion with @fridh, this re-organizes
the onboarding tutorial in the Nixpkgs manual's python section, so that we start
with the simplest, most ad-hoc examples and work our way up. This progresses
from:
1. How to create an temporary python env at the cmdline, then
2. How to create a specific python env for a single script, then
3. How to create a specific python env for a project in a shell.nix, then
4. How to install a specific python env globally on the system or in a user profile.
Additionally, I've tried to standardize on some of the "best practice" ways of
doing things:
1. Instead of saying that this command style is "supported but strongly not
   discouraged", I've just deleted it to avoid confusion.
   Bad:  nix-shell -p python38Packages.numpy python38Packages.toolz
   Good: nix-shell -p 'python38.withPackages(ps: with ps; [ numpy toolz ])'
2. In the portion where we show how to add stuff to the user's
   `XDG_CONFIG_HOME`, use overlays instead of `config.nix`. The former can do
   everything the latter can do, but is also much more generic and powerful,
   because it can compose with other files, compose with other envs, compose
   with overlays that do things like swap whether tensorflow and pytorch are
   built openblas/mkl/cuda stacks, and so on. The user is eventually going to
   see the overlay, so to avoid confusion let's standardize on it.
											 
										 
										
											2020-05-09 19:11:09 -04:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								Applications on Nix are typically installed into your user profile imperatively
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								using `nix-env -i` , and on NixOS declaratively by adding the package name to
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								`environment.systemPackages`  in `/etc/nixos/configuration.nix` . Dependencies
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								such as libraries are automatically installed and should not be installed
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								explicitly.
							 
						 
					
						
							
								
									
										
										
										
											2017-08-26 11:21:30 +02:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
											 
										 
										
											
												doc: Rewrite python onboarding tutorials in manual
Based on some feedback in #87094 and discussion with @fridh, this re-organizes
the onboarding tutorial in the Nixpkgs manual's python section, so that we start
with the simplest, most ad-hoc examples and work our way up. This progresses
from:
1. How to create an temporary python env at the cmdline, then
2. How to create a specific python env for a single script, then
3. How to create a specific python env for a project in a shell.nix, then
4. How to install a specific python env globally on the system or in a user profile.
Additionally, I've tried to standardize on some of the "best practice" ways of
doing things:
1. Instead of saying that this command style is "supported but strongly not
   discouraged", I've just deleted it to avoid confusion.
   Bad:  nix-shell -p python38Packages.numpy python38Packages.toolz
   Good: nix-shell -p 'python38.withPackages(ps: with ps; [ numpy toolz ])'
2. In the portion where we show how to add stuff to the user's
   `XDG_CONFIG_HOME`, use overlays instead of `config.nix`. The former can do
   everything the latter can do, but is also much more generic and powerful,
   because it can compose with other files, compose with other envs, compose
   with overlays that do things like swap whether tensorflow and pytorch are
   built openblas/mkl/cuda stacks, and so on. The user is eventually going to
   see the overlay, so to avoid confusion let's standardize on it.
											 
										 
										
											2020-05-09 19:11:09 -04:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								The same goes for Python applications. Python applications can be installed in
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								your profile, and will be wrapped to find their exact library dependencies,
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								without impacting other applications or polluting your user environment.
							 
						 
					
						
							
								
									
										
										
										
											2017-08-26 11:21:30 +02:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
											 
										 
										
											
												doc: Rewrite python onboarding tutorials in manual
Based on some feedback in #87094 and discussion with @fridh, this re-organizes
the onboarding tutorial in the Nixpkgs manual's python section, so that we start
with the simplest, most ad-hoc examples and work our way up. This progresses
from:
1. How to create an temporary python env at the cmdline, then
2. How to create a specific python env for a single script, then
3. How to create a specific python env for a project in a shell.nix, then
4. How to install a specific python env globally on the system or in a user profile.
Additionally, I've tried to standardize on some of the "best practice" ways of
doing things:
1. Instead of saying that this command style is "supported but strongly not
   discouraged", I've just deleted it to avoid confusion.
   Bad:  nix-shell -p python38Packages.numpy python38Packages.toolz
   Good: nix-shell -p 'python38.withPackages(ps: with ps; [ numpy toolz ])'
2. In the portion where we show how to add stuff to the user's
   `XDG_CONFIG_HOME`, use overlays instead of `config.nix`. The former can do
   everything the latter can do, but is also much more generic and powerful,
   because it can compose with other files, compose with other envs, compose
   with overlays that do things like swap whether tensorflow and pytorch are
   built openblas/mkl/cuda stacks, and so on. The user is eventually going to
   see the overlay, so to avoid confusion let's standardize on it.
											 
										 
										
											2020-05-09 19:11:09 -04:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								But Python libraries you would like to use for development cannot be installed,
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								at least not individually, because they won't be able to find each other
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								resulting in import errors. Instead, it is possible to create an environment
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								with `python.buildEnv`  or `python.withPackages`  where the interpreter and other
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								executables are wrapped to be able to find each other and all of the modules.
							 
						 
					
						
							
								
									
										
										
										
											2017-08-26 11:21:30 +02:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
											 
										 
										
											
												doc: Rewrite python onboarding tutorials in manual
Based on some feedback in #87094 and discussion with @fridh, this re-organizes
the onboarding tutorial in the Nixpkgs manual's python section, so that we start
with the simplest, most ad-hoc examples and work our way up. This progresses
from:
1. How to create an temporary python env at the cmdline, then
2. How to create a specific python env for a single script, then
3. How to create a specific python env for a project in a shell.nix, then
4. How to install a specific python env globally on the system or in a user profile.
Additionally, I've tried to standardize on some of the "best practice" ways of
doing things:
1. Instead of saying that this command style is "supported but strongly not
   discouraged", I've just deleted it to avoid confusion.
   Bad:  nix-shell -p python38Packages.numpy python38Packages.toolz
   Good: nix-shell -p 'python38.withPackages(ps: with ps; [ numpy toolz ])'
2. In the portion where we show how to add stuff to the user's
   `XDG_CONFIG_HOME`, use overlays instead of `config.nix`. The former can do
   everything the latter can do, but is also much more generic and powerful,
   because it can compose with other files, compose with other envs, compose
   with overlays that do things like swap whether tensorflow and pytorch are
   built openblas/mkl/cuda stacks, and so on. The user is eventually going to
   see the overlay, so to avoid confusion let's standardize on it.
											 
										 
										
											2020-05-09 19:11:09 -04:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								In the following examples we will start by creating a simple, ad-hoc environment
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								with a nix-shell that has `numpy`  and `toolz`  in Python 3.8; then we will create
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								a re-usable environment in a single-file Python script; then we will create a
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								full Python environment for development with this same environment.
							 
						 
					
						
							
								
									
										
										
										
											2020-02-09 11:23:11 -05:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
											 
										 
										
											
												doc: Rewrite python onboarding tutorials in manual
Based on some feedback in #87094 and discussion with @fridh, this re-organizes
the onboarding tutorial in the Nixpkgs manual's python section, so that we start
with the simplest, most ad-hoc examples and work our way up. This progresses
from:
1. How to create an temporary python env at the cmdline, then
2. How to create a specific python env for a single script, then
3. How to create a specific python env for a project in a shell.nix, then
4. How to install a specific python env globally on the system or in a user profile.
Additionally, I've tried to standardize on some of the "best practice" ways of
doing things:
1. Instead of saying that this command style is "supported but strongly not
   discouraged", I've just deleted it to avoid confusion.
   Bad:  nix-shell -p python38Packages.numpy python38Packages.toolz
   Good: nix-shell -p 'python38.withPackages(ps: with ps; [ numpy toolz ])'
2. In the portion where we show how to add stuff to the user's
   `XDG_CONFIG_HOME`, use overlays instead of `config.nix`. The former can do
   everything the latter can do, but is also much more generic and powerful,
   because it can compose with other files, compose with other envs, compose
   with overlays that do things like swap whether tensorflow and pytorch are
   built openblas/mkl/cuda stacks, and so on. The user is eventually going to
   see the overlay, so to avoid confusion let's standardize on it.
											 
										 
										
											2020-05-09 19:11:09 -04:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								Philosphically, this should be familiar to users who are used to a `venv`  style
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								of development: individual projects create their own Python environments without
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								impacting the global environment or each other.
							 
						 
					
						
							
								
									
										
										
										
											2017-08-26 11:21:30 +02:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
											 
										 
										
											
												doc: Rewrite python onboarding tutorials in manual
Based on some feedback in #87094 and discussion with @fridh, this re-organizes
the onboarding tutorial in the Nixpkgs manual's python section, so that we start
with the simplest, most ad-hoc examples and work our way up. This progresses
from:
1. How to create an temporary python env at the cmdline, then
2. How to create a specific python env for a single script, then
3. How to create a specific python env for a project in a shell.nix, then
4. How to install a specific python env globally on the system or in a user profile.
Additionally, I've tried to standardize on some of the "best practice" ways of
doing things:
1. Instead of saying that this command style is "supported but strongly not
   discouraged", I've just deleted it to avoid confusion.
   Bad:  nix-shell -p python38Packages.numpy python38Packages.toolz
   Good: nix-shell -p 'python38.withPackages(ps: with ps; [ numpy toolz ])'
2. In the portion where we show how to add stuff to the user's
   `XDG_CONFIG_HOME`, use overlays instead of `config.nix`. The former can do
   everything the latter can do, but is also much more generic and powerful,
   because it can compose with other files, compose with other envs, compose
   with overlays that do things like swap whether tensorflow and pytorch are
   built openblas/mkl/cuda stacks, and so on. The user is eventually going to
   see the overlay, so to avoid confusion let's standardize on it.
											 
										 
										
											2020-05-09 19:11:09 -04:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								#### Ad-hoc temporary Python environment with `nix-shell`
 
							 
						 
					
						
							
								
									
										
										
										
											2020-02-09 11:23:11 -05:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
											 
										 
										
											
												doc: Rewrite python onboarding tutorials in manual
Based on some feedback in #87094 and discussion with @fridh, this re-organizes
the onboarding tutorial in the Nixpkgs manual's python section, so that we start
with the simplest, most ad-hoc examples and work our way up. This progresses
from:
1. How to create an temporary python env at the cmdline, then
2. How to create a specific python env for a single script, then
3. How to create a specific python env for a project in a shell.nix, then
4. How to install a specific python env globally on the system or in a user profile.
Additionally, I've tried to standardize on some of the "best practice" ways of
doing things:
1. Instead of saying that this command style is "supported but strongly not
   discouraged", I've just deleted it to avoid confusion.
   Bad:  nix-shell -p python38Packages.numpy python38Packages.toolz
   Good: nix-shell -p 'python38.withPackages(ps: with ps; [ numpy toolz ])'
2. In the portion where we show how to add stuff to the user's
   `XDG_CONFIG_HOME`, use overlays instead of `config.nix`. The former can do
   everything the latter can do, but is also much more generic and powerful,
   because it can compose with other files, compose with other envs, compose
   with overlays that do things like swap whether tensorflow and pytorch are
   built openblas/mkl/cuda stacks, and so on. The user is eventually going to
   see the overlay, so to avoid confusion let's standardize on it.
											 
										 
										
											2020-05-09 19:11:09 -04:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								The simplest way to start playing with the way nix wraps and sets up Python
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								environments is with `nix-shell`  at the cmdline. These environments create a
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								temporary shell session with a Python and a *precise*  list of packages (plus
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								their runtime dependencies), with no other Python packages in the Python
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								interpreter's scope.
							 
						 
					
						
							
								
									
										
										
										
											2017-08-26 11:21:30 +02:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
											 
										 
										
											
												doc: Rewrite python onboarding tutorials in manual
Based on some feedback in #87094 and discussion with @fridh, this re-organizes
the onboarding tutorial in the Nixpkgs manual's python section, so that we start
with the simplest, most ad-hoc examples and work our way up. This progresses
from:
1. How to create an temporary python env at the cmdline, then
2. How to create a specific python env for a single script, then
3. How to create a specific python env for a project in a shell.nix, then
4. How to install a specific python env globally on the system or in a user profile.
Additionally, I've tried to standardize on some of the "best practice" ways of
doing things:
1. Instead of saying that this command style is "supported but strongly not
   discouraged", I've just deleted it to avoid confusion.
   Bad:  nix-shell -p python38Packages.numpy python38Packages.toolz
   Good: nix-shell -p 'python38.withPackages(ps: with ps; [ numpy toolz ])'
2. In the portion where we show how to add stuff to the user's
   `XDG_CONFIG_HOME`, use overlays instead of `config.nix`. The former can do
   everything the latter can do, but is also much more generic and powerful,
   because it can compose with other files, compose with other envs, compose
   with overlays that do things like swap whether tensorflow and pytorch are
   built openblas/mkl/cuda stacks, and so on. The user is eventually going to
   see the overlay, so to avoid confusion let's standardize on it.
											 
										 
										
											2020-05-09 19:11:09 -04:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								To create a Python 3.8 session with `numpy`  and `toolz`  available, run:
							 
						 
					
						
							
								
									
										
										
										
											2017-08-26 11:21:30 +02:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
											 
										 
										
											
												doc: Rewrite python onboarding tutorials in manual
Based on some feedback in #87094 and discussion with @fridh, this re-organizes
the onboarding tutorial in the Nixpkgs manual's python section, so that we start
with the simplest, most ad-hoc examples and work our way up. This progresses
from:
1. How to create an temporary python env at the cmdline, then
2. How to create a specific python env for a single script, then
3. How to create a specific python env for a project in a shell.nix, then
4. How to install a specific python env globally on the system or in a user profile.
Additionally, I've tried to standardize on some of the "best practice" ways of
doing things:
1. Instead of saying that this command style is "supported but strongly not
   discouraged", I've just deleted it to avoid confusion.
   Bad:  nix-shell -p python38Packages.numpy python38Packages.toolz
   Good: nix-shell -p 'python38.withPackages(ps: with ps; [ numpy toolz ])'
2. In the portion where we show how to add stuff to the user's
   `XDG_CONFIG_HOME`, use overlays instead of `config.nix`. The former can do
   everything the latter can do, but is also much more generic and powerful,
   because it can compose with other files, compose with other envs, compose
   with overlays that do things like swap whether tensorflow and pytorch are
   built openblas/mkl/cuda stacks, and so on. The user is eventually going to
   see the overlay, so to avoid confusion let's standardize on it.
											 
										 
										
											2020-05-09 19:11:09 -04:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								```sh
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								$ nix-shell -p 'python38.withPackages(ps: with ps; [ numpy toolz ])'
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								```
							 
						 
					
						
							
								
									
										
										
										
											2017-08-26 11:21:30 +02:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
											 
										 
										
											
												doc: Rewrite python onboarding tutorials in manual
Based on some feedback in #87094 and discussion with @fridh, this re-organizes
the onboarding tutorial in the Nixpkgs manual's python section, so that we start
with the simplest, most ad-hoc examples and work our way up. This progresses
from:
1. How to create an temporary python env at the cmdline, then
2. How to create a specific python env for a single script, then
3. How to create a specific python env for a project in a shell.nix, then
4. How to install a specific python env globally on the system or in a user profile.
Additionally, I've tried to standardize on some of the "best practice" ways of
doing things:
1. Instead of saying that this command style is "supported but strongly not
   discouraged", I've just deleted it to avoid confusion.
   Bad:  nix-shell -p python38Packages.numpy python38Packages.toolz
   Good: nix-shell -p 'python38.withPackages(ps: with ps; [ numpy toolz ])'
2. In the portion where we show how to add stuff to the user's
   `XDG_CONFIG_HOME`, use overlays instead of `config.nix`. The former can do
   everything the latter can do, but is also much more generic and powerful,
   because it can compose with other files, compose with other envs, compose
   with overlays that do things like swap whether tensorflow and pytorch are
   built openblas/mkl/cuda stacks, and so on. The user is eventually going to
   see the overlay, so to avoid confusion let's standardize on it.
											 
										 
										
											2020-05-09 19:11:09 -04:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								By default `nix-shell`  will start a `bash`  session with this interpreter in our
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								`PATH` , so if we then run:
							 
						 
					
						
							
								
									
										
										
										
											2017-08-26 11:21:30 +02:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
											 
										 
										
											
												doc: Rewrite python onboarding tutorials in manual
Based on some feedback in #87094 and discussion with @fridh, this re-organizes
the onboarding tutorial in the Nixpkgs manual's python section, so that we start
with the simplest, most ad-hoc examples and work our way up. This progresses
from:
1. How to create an temporary python env at the cmdline, then
2. How to create a specific python env for a single script, then
3. How to create a specific python env for a project in a shell.nix, then
4. How to install a specific python env globally on the system or in a user profile.
Additionally, I've tried to standardize on some of the "best practice" ways of
doing things:
1. Instead of saying that this command style is "supported but strongly not
   discouraged", I've just deleted it to avoid confusion.
   Bad:  nix-shell -p python38Packages.numpy python38Packages.toolz
   Good: nix-shell -p 'python38.withPackages(ps: with ps; [ numpy toolz ])'
2. In the portion where we show how to add stuff to the user's
   `XDG_CONFIG_HOME`, use overlays instead of `config.nix`. The former can do
   everything the latter can do, but is also much more generic and powerful,
   because it can compose with other files, compose with other envs, compose
   with overlays that do things like swap whether tensorflow and pytorch are
   built openblas/mkl/cuda stacks, and so on. The user is eventually going to
   see the overlay, so to avoid confusion let's standardize on it.
											 
										 
										
											2020-05-09 19:11:09 -04:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								```
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								[nix-shell:~/src/nixpkgs]$ python3
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								Python 3.8.1 (default, Dec 18 2019, 19:06:26)
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								[GCC 9.2.0] on linux
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								Type "help", "copyright", "credits" or "license" for more information.
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								>>> import numpy; import toolz
							 
						 
					
						
							
								
									
										
										
										
											2016-02-21 20:13:44 +01:00 
										
									 
								 
							 
							
								
							 
							
								 
							 
							
							
								```
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
											 
										 
										
											
												doc: Rewrite python onboarding tutorials in manual
Based on some feedback in #87094 and discussion with @fridh, this re-organizes
the onboarding tutorial in the Nixpkgs manual's python section, so that we start
with the simplest, most ad-hoc examples and work our way up. This progresses
from:
1. How to create an temporary python env at the cmdline, then
2. How to create a specific python env for a single script, then
3. How to create a specific python env for a project in a shell.nix, then
4. How to install a specific python env globally on the system or in a user profile.
Additionally, I've tried to standardize on some of the "best practice" ways of
doing things:
1. Instead of saying that this command style is "supported but strongly not
   discouraged", I've just deleted it to avoid confusion.
   Bad:  nix-shell -p python38Packages.numpy python38Packages.toolz
   Good: nix-shell -p 'python38.withPackages(ps: with ps; [ numpy toolz ])'
2. In the portion where we show how to add stuff to the user's
   `XDG_CONFIG_HOME`, use overlays instead of `config.nix`. The former can do
   everything the latter can do, but is also much more generic and powerful,
   because it can compose with other files, compose with other envs, compose
   with overlays that do things like swap whether tensorflow and pytorch are
   built openblas/mkl/cuda stacks, and so on. The user is eventually going to
   see the overlay, so to avoid confusion let's standardize on it.
											 
										 
										
											2020-05-09 19:11:09 -04:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								Note that no other modules are in scope, even if they were imperatively
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								installed into our user environment as a dependency of a Python application:
							 
						 
					
						
							
								
									
										
										
										
											2016-02-21 20:13:44 +01:00 
										
									 
								 
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
											 
										 
										
											
												doc: Rewrite python onboarding tutorials in manual
Based on some feedback in #87094 and discussion with @fridh, this re-organizes
the onboarding tutorial in the Nixpkgs manual's python section, so that we start
with the simplest, most ad-hoc examples and work our way up. This progresses
from:
1. How to create an temporary python env at the cmdline, then
2. How to create a specific python env for a single script, then
3. How to create a specific python env for a project in a shell.nix, then
4. How to install a specific python env globally on the system or in a user profile.
Additionally, I've tried to standardize on some of the "best practice" ways of
doing things:
1. Instead of saying that this command style is "supported but strongly not
   discouraged", I've just deleted it to avoid confusion.
   Bad:  nix-shell -p python38Packages.numpy python38Packages.toolz
   Good: nix-shell -p 'python38.withPackages(ps: with ps; [ numpy toolz ])'
2. In the portion where we show how to add stuff to the user's
   `XDG_CONFIG_HOME`, use overlays instead of `config.nix`. The former can do
   everything the latter can do, but is also much more generic and powerful,
   because it can compose with other files, compose with other envs, compose
   with overlays that do things like swap whether tensorflow and pytorch are
   built openblas/mkl/cuda stacks, and so on. The user is eventually going to
   see the overlay, so to avoid confusion let's standardize on it.
											 
										 
										
											2020-05-09 19:11:09 -04:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								```
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								>>> import requests
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								Traceback (most recent call last):
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								  File "< stdin > ", line 1, in < module > 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								ModuleNotFoundError: No module named 'requests'
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								```
							 
						 
					
						
							
								
									
										
										
										
											2017-08-26 11:21:30 +02:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
											 
										 
										
											
												doc: Rewrite python onboarding tutorials in manual
Based on some feedback in #87094 and discussion with @fridh, this re-organizes
the onboarding tutorial in the Nixpkgs manual's python section, so that we start
with the simplest, most ad-hoc examples and work our way up. This progresses
from:
1. How to create an temporary python env at the cmdline, then
2. How to create a specific python env for a single script, then
3. How to create a specific python env for a project in a shell.nix, then
4. How to install a specific python env globally on the system or in a user profile.
Additionally, I've tried to standardize on some of the "best practice" ways of
doing things:
1. Instead of saying that this command style is "supported but strongly not
   discouraged", I've just deleted it to avoid confusion.
   Bad:  nix-shell -p python38Packages.numpy python38Packages.toolz
   Good: nix-shell -p 'python38.withPackages(ps: with ps; [ numpy toolz ])'
2. In the portion where we show how to add stuff to the user's
   `XDG_CONFIG_HOME`, use overlays instead of `config.nix`. The former can do
   everything the latter can do, but is also much more generic and powerful,
   because it can compose with other files, compose with other envs, compose
   with overlays that do things like swap whether tensorflow and pytorch are
   built openblas/mkl/cuda stacks, and so on. The user is eventually going to
   see the overlay, so to avoid confusion let's standardize on it.
											 
										 
										
											2020-05-09 19:11:09 -04:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								We can add as many additional modules onto the `nix-shell`  as we need, and we
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								will still get 1 wrapped Python interpreter. We can start the interpreter
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								directly like so:
							 
						 
					
						
							
								
									
										
										
										
											2020-02-09 11:23:11 -05:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-08-26 11:21:30 +02:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								```sh
							 
						 
					
						
							
								
									
										
											 
										 
										
											
												doc: Rewrite python onboarding tutorials in manual
Based on some feedback in #87094 and discussion with @fridh, this re-organizes
the onboarding tutorial in the Nixpkgs manual's python section, so that we start
with the simplest, most ad-hoc examples and work our way up. This progresses
from:
1. How to create an temporary python env at the cmdline, then
2. How to create a specific python env for a single script, then
3. How to create a specific python env for a project in a shell.nix, then
4. How to install a specific python env globally on the system or in a user profile.
Additionally, I've tried to standardize on some of the "best practice" ways of
doing things:
1. Instead of saying that this command style is "supported but strongly not
   discouraged", I've just deleted it to avoid confusion.
   Bad:  nix-shell -p python38Packages.numpy python38Packages.toolz
   Good: nix-shell -p 'python38.withPackages(ps: with ps; [ numpy toolz ])'
2. In the portion where we show how to add stuff to the user's
   `XDG_CONFIG_HOME`, use overlays instead of `config.nix`. The former can do
   everything the latter can do, but is also much more generic and powerful,
   because it can compose with other files, compose with other envs, compose
   with overlays that do things like swap whether tensorflow and pytorch are
   built openblas/mkl/cuda stacks, and so on. The user is eventually going to
   see the overlay, so to avoid confusion let's standardize on it.
											 
										 
										
											2020-05-09 19:11:09 -04:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								$ nix-shell -p 'python38.withPackages(ps: with ps; [ numpy toolz requests ])' --run python3
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								these derivations will be built:
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								  /nix/store/xbdsrqrsfa1yva5s7pzsra8k08gxlbz1-python3-3.8.1-env.drv
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								building '/nix/store/xbdsrqrsfa1yva5s7pzsra8k08gxlbz1-python3-3.8.1-env.drv'...
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								created 277 symlinks in user environment
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								Python 3.8.1 (default, Dec 18 2019, 19:06:26)
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								[GCC 9.2.0] on linux
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								Type "help", "copyright", "credits" or "license" for more information.
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								>>> import requests
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								>>>
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								```
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								Notice that this time it built a new Python environment, which now includes
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								`requests` . Building an environment just creates wrapper scripts that expose the
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								selected dependencies to the interpreter while re-using the actual modules. This
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								means if any other env has installed `requests`  or `numpy`  in a different
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								context, we don't need to recompile them -- we just recompile the wrapper script
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								that sets up an interpreter pointing to them. This matters much more for "big"
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								modules like `pytorch`  or `tensorflow` .
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								Module names usually match their names on [pypi.org ](https://pypi.org/ ), but
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								you can use the [Nixpkgs search website ](https://nixos.org/nixos/packages.html )
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								to find them as well (along with non-python packages).
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								At this point we can create throwaway experimental Python environments with
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								arbitrary dependencies. This is a good way to get a feel for how the Python
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								interpreter and dependencies work in Nix and NixOS, but to do some actual
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								development, we'll want to make it a bit more persistent.
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								##### Running Python scripts and using `nix-shell` as shebang
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								Sometimes, we have a script whose header looks like this:
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								```python
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								#!/usr/bin/env python3
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								import numpy as np
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								a = np.array([1,2])
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								b = np.array([3,4])
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								print(f"The dot product of {a} and {b} is: {np.dot(a, b)}")
							 
						 
					
						
							
								
									
										
										
										
											2017-08-26 11:21:30 +02:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								```
							 
						 
					
						
							
								
									
										
										
										
											2020-02-09 11:23:11 -05:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
											 
										 
										
											
												doc: Rewrite python onboarding tutorials in manual
Based on some feedback in #87094 and discussion with @fridh, this re-organizes
the onboarding tutorial in the Nixpkgs manual's python section, so that we start
with the simplest, most ad-hoc examples and work our way up. This progresses
from:
1. How to create an temporary python env at the cmdline, then
2. How to create a specific python env for a single script, then
3. How to create a specific python env for a project in a shell.nix, then
4. How to install a specific python env globally on the system or in a user profile.
Additionally, I've tried to standardize on some of the "best practice" ways of
doing things:
1. Instead of saying that this command style is "supported but strongly not
   discouraged", I've just deleted it to avoid confusion.
   Bad:  nix-shell -p python38Packages.numpy python38Packages.toolz
   Good: nix-shell -p 'python38.withPackages(ps: with ps; [ numpy toolz ])'
2. In the portion where we show how to add stuff to the user's
   `XDG_CONFIG_HOME`, use overlays instead of `config.nix`. The former can do
   everything the latter can do, but is also much more generic and powerful,
   because it can compose with other files, compose with other envs, compose
   with overlays that do things like swap whether tensorflow and pytorch are
   built openblas/mkl/cuda stacks, and so on. The user is eventually going to
   see the overlay, so to avoid confusion let's standardize on it.
											 
										 
										
											2020-05-09 19:11:09 -04:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								Executing this script requires a `python3`  that has `numpy` . Using what we learned
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								in the previous section, we could startup a shell and just run it like so:
							 
						 
					
						
							
								
									
										
										
										
											2020-02-09 11:23:11 -05:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
											 
										 
										
											
												doc: Rewrite python onboarding tutorials in manual
Based on some feedback in #87094 and discussion with @fridh, this re-organizes
the onboarding tutorial in the Nixpkgs manual's python section, so that we start
with the simplest, most ad-hoc examples and work our way up. This progresses
from:
1. How to create an temporary python env at the cmdline, then
2. How to create a specific python env for a single script, then
3. How to create a specific python env for a project in a shell.nix, then
4. How to install a specific python env globally on the system or in a user profile.
Additionally, I've tried to standardize on some of the "best practice" ways of
doing things:
1. Instead of saying that this command style is "supported but strongly not
   discouraged", I've just deleted it to avoid confusion.
   Bad:  nix-shell -p python38Packages.numpy python38Packages.toolz
   Good: nix-shell -p 'python38.withPackages(ps: with ps; [ numpy toolz ])'
2. In the portion where we show how to add stuff to the user's
   `XDG_CONFIG_HOME`, use overlays instead of `config.nix`. The former can do
   everything the latter can do, but is also much more generic and powerful,
   because it can compose with other files, compose with other envs, compose
   with overlays that do things like swap whether tensorflow and pytorch are
   built openblas/mkl/cuda stacks, and so on. The user is eventually going to
   see the overlay, so to avoid confusion let's standardize on it.
											 
										 
										
											2020-05-09 19:11:09 -04:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								```
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								nix-shell -p 'python38.withPackages(ps: with ps; [ numpy ])' --run 'python3 foo.py'
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								The dot product of [1 2] and [3 4] is: 11
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								```
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								But if we maintain the script ourselves, and if there are more dependencies, it
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								may be nice to encode those dependencies in source to make the script re-usable
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								without that bit of knowledge. That can be done by using `nix-shell`  as a
							 
						 
					
						
							
								
									
										
										
										
											2020-11-28 12:06:50 +09:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								[shebang ](https://en.wikipedia.org/wiki/Shebang_(Unix )), like so:
							 
						 
					
						
							
								
									
										
											 
										 
										
											
												doc: Rewrite python onboarding tutorials in manual
Based on some feedback in #87094 and discussion with @fridh, this re-organizes
the onboarding tutorial in the Nixpkgs manual's python section, so that we start
with the simplest, most ad-hoc examples and work our way up. This progresses
from:
1. How to create an temporary python env at the cmdline, then
2. How to create a specific python env for a single script, then
3. How to create a specific python env for a project in a shell.nix, then
4. How to install a specific python env globally on the system or in a user profile.
Additionally, I've tried to standardize on some of the "best practice" ways of
doing things:
1. Instead of saying that this command style is "supported but strongly not
   discouraged", I've just deleted it to avoid confusion.
   Bad:  nix-shell -p python38Packages.numpy python38Packages.toolz
   Good: nix-shell -p 'python38.withPackages(ps: with ps; [ numpy toolz ])'
2. In the portion where we show how to add stuff to the user's
   `XDG_CONFIG_HOME`, use overlays instead of `config.nix`. The former can do
   everything the latter can do, but is also much more generic and powerful,
   because it can compose with other files, compose with other envs, compose
   with overlays that do things like swap whether tensorflow and pytorch are
   built openblas/mkl/cuda stacks, and so on. The user is eventually going to
   see the overlay, so to avoid confusion let's standardize on it.
											 
										 
										
											2020-05-09 19:11:09 -04:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								```python
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								#!/usr/bin/env nix-shell
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								#!nix-shell -i python3 -p "python3.withPackages(ps: [ ps.numpy ])"
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								import numpy as np
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								a = np.array([1,2])
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								b = np.array([3,4])
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								print(f"The dot product of {a} and {b} is: {np.dot(a, b)}")
							 
						 
					
						
							
								
									
										
										
										
											2016-02-21 20:13:44 +01:00 
										
									 
								 
							 
							
								
							 
							
								 
							 
							
							
								```
							 
						 
					
						
							
								
									
										
										
										
											2020-02-09 11:23:11 -05:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
											 
										 
										
											
												doc: Rewrite python onboarding tutorials in manual
Based on some feedback in #87094 and discussion with @fridh, this re-organizes
the onboarding tutorial in the Nixpkgs manual's python section, so that we start
with the simplest, most ad-hoc examples and work our way up. This progresses
from:
1. How to create an temporary python env at the cmdline, then
2. How to create a specific python env for a single script, then
3. How to create a specific python env for a project in a shell.nix, then
4. How to install a specific python env globally on the system or in a user profile.
Additionally, I've tried to standardize on some of the "best practice" ways of
doing things:
1. Instead of saying that this command style is "supported but strongly not
   discouraged", I've just deleted it to avoid confusion.
   Bad:  nix-shell -p python38Packages.numpy python38Packages.toolz
   Good: nix-shell -p 'python38.withPackages(ps: with ps; [ numpy toolz ])'
2. In the portion where we show how to add stuff to the user's
   `XDG_CONFIG_HOME`, use overlays instead of `config.nix`. The former can do
   everything the latter can do, but is also much more generic and powerful,
   because it can compose with other files, compose with other envs, compose
   with overlays that do things like swap whether tensorflow and pytorch are
   built openblas/mkl/cuda stacks, and so on. The user is eventually going to
   see the overlay, so to avoid confusion let's standardize on it.
											 
										 
										
											2020-05-09 19:11:09 -04:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								Then we simply execute it, without requiring any environment setup at all!
							 
						 
					
						
							
								
									
										
										
										
											2016-02-21 20:13:44 +01:00 
										
									 
								 
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								```sh
							 
						 
					
						
							
								
									
										
											 
										 
										
											
												doc: Rewrite python onboarding tutorials in manual
Based on some feedback in #87094 and discussion with @fridh, this re-organizes
the onboarding tutorial in the Nixpkgs manual's python section, so that we start
with the simplest, most ad-hoc examples and work our way up. This progresses
from:
1. How to create an temporary python env at the cmdline, then
2. How to create a specific python env for a single script, then
3. How to create a specific python env for a project in a shell.nix, then
4. How to install a specific python env globally on the system or in a user profile.
Additionally, I've tried to standardize on some of the "best practice" ways of
doing things:
1. Instead of saying that this command style is "supported but strongly not
   discouraged", I've just deleted it to avoid confusion.
   Bad:  nix-shell -p python38Packages.numpy python38Packages.toolz
   Good: nix-shell -p 'python38.withPackages(ps: with ps; [ numpy toolz ])'
2. In the portion where we show how to add stuff to the user's
   `XDG_CONFIG_HOME`, use overlays instead of `config.nix`. The former can do
   everything the latter can do, but is also much more generic and powerful,
   because it can compose with other files, compose with other envs, compose
   with overlays that do things like swap whether tensorflow and pytorch are
   built openblas/mkl/cuda stacks, and so on. The user is eventually going to
   see the overlay, so to avoid confusion let's standardize on it.
											 
										 
										
											2020-05-09 19:11:09 -04:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								$ ./foo.py
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								The dot product of [1 2] and [3 4] is: 11
							 
						 
					
						
							
								
									
										
										
										
											2017-08-26 11:21:30 +02:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								```
							 
						 
					
						
							
								
									
										
										
										
											2020-02-09 11:23:11 -05:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
											 
										 
										
											
												doc: Rewrite python onboarding tutorials in manual
Based on some feedback in #87094 and discussion with @fridh, this re-organizes
the onboarding tutorial in the Nixpkgs manual's python section, so that we start
with the simplest, most ad-hoc examples and work our way up. This progresses
from:
1. How to create an temporary python env at the cmdline, then
2. How to create a specific python env for a single script, then
3. How to create a specific python env for a project in a shell.nix, then
4. How to install a specific python env globally on the system or in a user profile.
Additionally, I've tried to standardize on some of the "best practice" ways of
doing things:
1. Instead of saying that this command style is "supported but strongly not
   discouraged", I've just deleted it to avoid confusion.
   Bad:  nix-shell -p python38Packages.numpy python38Packages.toolz
   Good: nix-shell -p 'python38.withPackages(ps: with ps; [ numpy toolz ])'
2. In the portion where we show how to add stuff to the user's
   `XDG_CONFIG_HOME`, use overlays instead of `config.nix`. The former can do
   everything the latter can do, but is also much more generic and powerful,
   because it can compose with other files, compose with other envs, compose
   with overlays that do things like swap whether tensorflow and pytorch are
   built openblas/mkl/cuda stacks, and so on. The user is eventually going to
   see the overlay, so to avoid confusion let's standardize on it.
											 
										 
										
											2020-05-09 19:11:09 -04:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								If the dependencies are not available on the host where `foo.py`  is executed, it
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								will build or download them from a Nix binary cache prior to starting up, prior
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								that it is executed on a machine with a multi-user nix installation.
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								This provides a way to ship a self bootstrapping Python script, akin to a
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								statically linked binary, where it can be run on any machine (provided nix is
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								installed) without having to assume that `numpy`  is installed globally on the
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								system.
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								By default it is pulling the import checkout of Nixpkgs itself from our nix
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								channel, which is nice as it cache aligns with our other package builds, but we
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								can make it fully reproducible by pinning the `nixpkgs`  import:
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								```python
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								#!/usr/bin/env nix-shell
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								#!nix-shell -i python3 -p "python3.withPackages(ps: [ ps.numpy ])"
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								#!nix-shell -I nixpkgs=https://github.com/NixOS/nixpkgs/archive/d373d80b1207d52621961b16aa4a3438e4f98167.tar.gz
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								import numpy as np
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								a = np.array([1,2])
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								b = np.array([3,4])
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								print(f"The dot product of {a} and {b} is: {np.dot(a, b)}")
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								```
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								This will execute with the exact same versions of Python 3.8, numpy, and system
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								dependencies a year from now as it does today, because it will always use
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								exactly git commit `d373d80b1207d52621961b16aa4a3438e4f98167`  of Nixpkgs for all
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								of the package versions.
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								This is also a great way to ensure the script executes identically on different
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								servers.
							 
						 
					
						
							
								
									
										
										
										
											2017-08-26 11:21:30 +02:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								##### Load environment from `.nix` expression
 
							 
						 
					
						
							
								
									
										
											 
										 
										
											
												doc: Rewrite python onboarding tutorials in manual
Based on some feedback in #87094 and discussion with @fridh, this re-organizes
the onboarding tutorial in the Nixpkgs manual's python section, so that we start
with the simplest, most ad-hoc examples and work our way up. This progresses
from:
1. How to create an temporary python env at the cmdline, then
2. How to create a specific python env for a single script, then
3. How to create a specific python env for a project in a shell.nix, then
4. How to install a specific python env globally on the system or in a user profile.
Additionally, I've tried to standardize on some of the "best practice" ways of
doing things:
1. Instead of saying that this command style is "supported but strongly not
   discouraged", I've just deleted it to avoid confusion.
   Bad:  nix-shell -p python38Packages.numpy python38Packages.toolz
   Good: nix-shell -p 'python38.withPackages(ps: with ps; [ numpy toolz ])'
2. In the portion where we show how to add stuff to the user's
   `XDG_CONFIG_HOME`, use overlays instead of `config.nix`. The former can do
   everything the latter can do, but is also much more generic and powerful,
   because it can compose with other files, compose with other envs, compose
   with overlays that do things like swap whether tensorflow and pytorch are
   built openblas/mkl/cuda stacks, and so on. The user is eventually going to
   see the overlay, so to avoid confusion let's standardize on it.
											 
										 
										
											2020-05-09 19:11:09 -04:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								We've now seen how to create an ad-hoc temporary shell session, and how to
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								create a single script with Python dependencies, but in the course of normal
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								development we're usually working in an entire package repository.
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								As explained in the Nix manual, `nix-shell`  can also load an expression from a
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								`.nix`  file. Say we want to have Python 3.8, `numpy`  and `toolz` , like before,
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								in an environment. We can add a `shell.nix`  file describing our dependencies:
							 
						 
					
						
							
								
									
										
										
										
											2020-02-09 11:23:11 -05:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-08-26 11:21:30 +02:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								```nix
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								with import < nixpkgs >  {};
							 
						 
					
						
							
								
									
										
										
										
											2020-05-09 12:58:00 -04:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								(python38.withPackages (ps: [ps.numpy ps.toolz])).env
							 
						 
					
						
							
								
									
										
										
										
											2016-02-21 20:13:44 +01:00 
										
									 
								 
							 
							
								
							 
							
								 
							 
							
							
								```
							 
						 
					
						
							
								
									
										
										
										
											2020-02-09 11:23:11 -05:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
											 
										 
										
											
												doc: Rewrite python onboarding tutorials in manual
Based on some feedback in #87094 and discussion with @fridh, this re-organizes
the onboarding tutorial in the Nixpkgs manual's python section, so that we start
with the simplest, most ad-hoc examples and work our way up. This progresses
from:
1. How to create an temporary python env at the cmdline, then
2. How to create a specific python env for a single script, then
3. How to create a specific python env for a project in a shell.nix, then
4. How to install a specific python env globally on the system or in a user profile.
Additionally, I've tried to standardize on some of the "best practice" ways of
doing things:
1. Instead of saying that this command style is "supported but strongly not
   discouraged", I've just deleted it to avoid confusion.
   Bad:  nix-shell -p python38Packages.numpy python38Packages.toolz
   Good: nix-shell -p 'python38.withPackages(ps: with ps; [ numpy toolz ])'
2. In the portion where we show how to add stuff to the user's
   `XDG_CONFIG_HOME`, use overlays instead of `config.nix`. The former can do
   everything the latter can do, but is also much more generic and powerful,
   because it can compose with other files, compose with other envs, compose
   with overlays that do things like swap whether tensorflow and pytorch are
   built openblas/mkl/cuda stacks, and so on. The user is eventually going to
   see the overlay, so to avoid confusion let's standardize on it.
											 
										 
										
											2020-05-09 19:11:09 -04:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								And then at the command line, just typing `nix-shell`  produces the same
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								environment as before. In a normal project, we'll likely have many more
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								dependencies; this can provide a way for developers to share the environments
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								with each other and with CI builders.
							 
						 
					
						
							
								
									
										
										
										
											2017-08-26 11:21:30 +02:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								What's happening here?
							 
						 
					
						
							
								
									
										
										
										
											2016-02-21 20:13:44 +01:00 
										
									 
								 
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2020-02-09 11:23:11 -05:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								1.  We begin with importing the Nix Packages collections. `import <nixpkgs>` 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								   imports the `<nixpkgs>`  function, `{}`  calls it and the `with`  statement
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								   brings all attributes of `nixpkgs`  in the local scope. These attributes form
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								   the main package set.
							 
						 
					
						
							
								
									
										
											 
										 
										
											
												doc: Rewrite python onboarding tutorials in manual
Based on some feedback in #87094 and discussion with @fridh, this re-organizes
the onboarding tutorial in the Nixpkgs manual's python section, so that we start
with the simplest, most ad-hoc examples and work our way up. This progresses
from:
1. How to create an temporary python env at the cmdline, then
2. How to create a specific python env for a single script, then
3. How to create a specific python env for a project in a shell.nix, then
4. How to install a specific python env globally on the system or in a user profile.
Additionally, I've tried to standardize on some of the "best practice" ways of
doing things:
1. Instead of saying that this command style is "supported but strongly not
   discouraged", I've just deleted it to avoid confusion.
   Bad:  nix-shell -p python38Packages.numpy python38Packages.toolz
   Good: nix-shell -p 'python38.withPackages(ps: with ps; [ numpy toolz ])'
2. In the portion where we show how to add stuff to the user's
   `XDG_CONFIG_HOME`, use overlays instead of `config.nix`. The former can do
   everything the latter can do, but is also much more generic and powerful,
   because it can compose with other files, compose with other envs, compose
   with overlays that do things like swap whether tensorflow and pytorch are
   built openblas/mkl/cuda stacks, and so on. The user is eventually going to
   see the overlay, so to avoid confusion let's standardize on it.
											 
										 
										
											2020-05-09 19:11:09 -04:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								2.  Then we create a Python 3.8 environment with the `withPackages`  function, as before.
							 
						 
					
						
							
								
									
										
										
										
											2020-02-09 11:23:11 -05:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								3.  The `withPackages`  function expects us to provide a function as an argument
							 
						 
					
						
							
								
									
										
											 
										 
										
											
												doc: Rewrite python onboarding tutorials in manual
Based on some feedback in #87094 and discussion with @fridh, this re-organizes
the onboarding tutorial in the Nixpkgs manual's python section, so that we start
with the simplest, most ad-hoc examples and work our way up. This progresses
from:
1. How to create an temporary python env at the cmdline, then
2. How to create a specific python env for a single script, then
3. How to create a specific python env for a project in a shell.nix, then
4. How to install a specific python env globally on the system or in a user profile.
Additionally, I've tried to standardize on some of the "best practice" ways of
doing things:
1. Instead of saying that this command style is "supported but strongly not
   discouraged", I've just deleted it to avoid confusion.
   Bad:  nix-shell -p python38Packages.numpy python38Packages.toolz
   Good: nix-shell -p 'python38.withPackages(ps: with ps; [ numpy toolz ])'
2. In the portion where we show how to add stuff to the user's
   `XDG_CONFIG_HOME`, use overlays instead of `config.nix`. The former can do
   everything the latter can do, but is also much more generic and powerful,
   because it can compose with other files, compose with other envs, compose
   with overlays that do things like swap whether tensorflow and pytorch are
   built openblas/mkl/cuda stacks, and so on. The user is eventually going to
   see the overlay, so to avoid confusion let's standardize on it.
											 
										 
										
											2020-05-09 19:11:09 -04:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								   that takes the set of all Python packages and returns a list of packages to
							 
						 
					
						
							
								
									
										
										
										
											2020-02-09 11:23:11 -05:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								   include in the environment. Here, we select the packages `numpy`  and `toolz` 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								   from the package set.
							 
						 
					
						
							
								
									
										
										
										
											2016-02-21 20:13:44 +01:00 
										
									 
								 
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2019-11-09 10:25:57 +01:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								To combine this with `mkShell`  you can:
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								```nix
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								with import < nixpkgs >  {};
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								let
							 
						 
					
						
							
								
									
										
										
										
											2020-05-09 12:58:00 -04:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								  pythonEnv = python38.withPackages (ps: [
							 
						 
					
						
							
								
									
										
										
										
											2019-11-09 10:25:57 +01:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								    ps.numpy
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    ps.toolz
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								  ]);
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								in mkShell {
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								  buildInputs = [
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    pythonEnv
							 
						 
					
						
							
								
									
										
											 
										 
										
											
												doc: Rewrite python onboarding tutorials in manual
Based on some feedback in #87094 and discussion with @fridh, this re-organizes
the onboarding tutorial in the Nixpkgs manual's python section, so that we start
with the simplest, most ad-hoc examples and work our way up. This progresses
from:
1. How to create an temporary python env at the cmdline, then
2. How to create a specific python env for a single script, then
3. How to create a specific python env for a project in a shell.nix, then
4. How to install a specific python env globally on the system or in a user profile.
Additionally, I've tried to standardize on some of the "best practice" ways of
doing things:
1. Instead of saying that this command style is "supported but strongly not
   discouraged", I've just deleted it to avoid confusion.
   Bad:  nix-shell -p python38Packages.numpy python38Packages.toolz
   Good: nix-shell -p 'python38.withPackages(ps: with ps; [ numpy toolz ])'
2. In the portion where we show how to add stuff to the user's
   `XDG_CONFIG_HOME`, use overlays instead of `config.nix`. The former can do
   everything the latter can do, but is also much more generic and powerful,
   because it can compose with other files, compose with other envs, compose
   with overlays that do things like swap whether tensorflow and pytorch are
   built openblas/mkl/cuda stacks, and so on. The user is eventually going to
   see the overlay, so to avoid confusion let's standardize on it.
											 
										 
										
											2020-05-09 19:11:09 -04:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    black
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    mypy
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    libffi
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    openssl
							 
						 
					
						
							
								
									
										
										
										
											2019-11-09 10:25:57 +01:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								  ];
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								}
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								```
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
											 
										 
										
											
												doc: Rewrite python onboarding tutorials in manual
Based on some feedback in #87094 and discussion with @fridh, this re-organizes
the onboarding tutorial in the Nixpkgs manual's python section, so that we start
with the simplest, most ad-hoc examples and work our way up. This progresses
from:
1. How to create an temporary python env at the cmdline, then
2. How to create a specific python env for a single script, then
3. How to create a specific python env for a project in a shell.nix, then
4. How to install a specific python env globally on the system or in a user profile.
Additionally, I've tried to standardize on some of the "best practice" ways of
doing things:
1. Instead of saying that this command style is "supported but strongly not
   discouraged", I've just deleted it to avoid confusion.
   Bad:  nix-shell -p python38Packages.numpy python38Packages.toolz
   Good: nix-shell -p 'python38.withPackages(ps: with ps; [ numpy toolz ])'
2. In the portion where we show how to add stuff to the user's
   `XDG_CONFIG_HOME`, use overlays instead of `config.nix`. The former can do
   everything the latter can do, but is also much more generic and powerful,
   because it can compose with other files, compose with other envs, compose
   with overlays that do things like swap whether tensorflow and pytorch are
   built openblas/mkl/cuda stacks, and so on. The user is eventually going to
   see the overlay, so to avoid confusion let's standardize on it.
											 
										 
										
											2020-05-09 19:11:09 -04:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								This will create a unified environment that has not just our Python interpreter
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								and its Python dependencies, but also tools like `black`  or `mypy`  and libraries
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								like `libffi`  the `openssl`  in scope. This is generic and can span any number of
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								tools or languages across the Nixpkgs ecosystem.
							 
						 
					
						
							
								
									
										
										
										
											2020-02-09 11:23:11 -05:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
											 
										 
										
											
												doc: Rewrite python onboarding tutorials in manual
Based on some feedback in #87094 and discussion with @fridh, this re-organizes
the onboarding tutorial in the Nixpkgs manual's python section, so that we start
with the simplest, most ad-hoc examples and work our way up. This progresses
from:
1. How to create an temporary python env at the cmdline, then
2. How to create a specific python env for a single script, then
3. How to create a specific python env for a project in a shell.nix, then
4. How to install a specific python env globally on the system or in a user profile.
Additionally, I've tried to standardize on some of the "best practice" ways of
doing things:
1. Instead of saying that this command style is "supported but strongly not
   discouraged", I've just deleted it to avoid confusion.
   Bad:  nix-shell -p python38Packages.numpy python38Packages.toolz
   Good: nix-shell -p 'python38.withPackages(ps: with ps; [ numpy toolz ])'
2. In the portion where we show how to add stuff to the user's
   `XDG_CONFIG_HOME`, use overlays instead of `config.nix`. The former can do
   everything the latter can do, but is also much more generic and powerful,
   because it can compose with other files, compose with other envs, compose
   with overlays that do things like swap whether tensorflow and pytorch are
   built openblas/mkl/cuda stacks, and so on. The user is eventually going to
   see the overlay, so to avoid confusion let's standardize on it.
											 
										 
										
											2020-05-09 19:11:09 -04:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								##### Installing environments globally on the system
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								Up to now, we've been creating environments scoped to an ad-hoc shell session,
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								or a single script, or a single project. This is generally advisable, as it
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								avoids pollution across contexts.
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								However, sometimes we know we will often want a Python with some basic packages,
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								and want this available without having to enter into a shell or build context.
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								This can be useful to have things like vim/emacs editors and plugins or shell
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								tools "just work" without having to set them up, or when running other software
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								that expects packages to be installed globally.
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								To create your own custom environment, create a file in `~/.config/nixpkgs/overlays/` 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								that looks like this:
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								```nix
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								# ~/.config/nixpkgs/overlays/myEnv.nix
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								self: super: {
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								  myEnv = super.buildEnv {
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    name = "myEnv";
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    paths = [
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								      # A Python 3 interpreter with some packages
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								      (self.python3.withPackages (
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								        ps: with ps; [
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								          pyflakes
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								          pytest
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								          python-language-server
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								        ]
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								      ))
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								      # Some other packages we'd like as part of this env
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								      self.mypy
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								      self.black
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								      self.ripgrep
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								      self.tmux
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    ];
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								  };
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								}
							 
						 
					
						
							
								
									
										
										
										
											2017-08-26 11:21:30 +02:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								```
							 
						 
					
						
							
								
									
										
										
										
											2020-02-09 11:23:11 -05:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
											 
										 
										
											
												doc: Rewrite python onboarding tutorials in manual
Based on some feedback in #87094 and discussion with @fridh, this re-organizes
the onboarding tutorial in the Nixpkgs manual's python section, so that we start
with the simplest, most ad-hoc examples and work our way up. This progresses
from:
1. How to create an temporary python env at the cmdline, then
2. How to create a specific python env for a single script, then
3. How to create a specific python env for a project in a shell.nix, then
4. How to install a specific python env globally on the system or in a user profile.
Additionally, I've tried to standardize on some of the "best practice" ways of
doing things:
1. Instead of saying that this command style is "supported but strongly not
   discouraged", I've just deleted it to avoid confusion.
   Bad:  nix-shell -p python38Packages.numpy python38Packages.toolz
   Good: nix-shell -p 'python38.withPackages(ps: with ps; [ numpy toolz ])'
2. In the portion where we show how to add stuff to the user's
   `XDG_CONFIG_HOME`, use overlays instead of `config.nix`. The former can do
   everything the latter can do, but is also much more generic and powerful,
   because it can compose with other files, compose with other envs, compose
   with overlays that do things like swap whether tensorflow and pytorch are
   built openblas/mkl/cuda stacks, and so on. The user is eventually going to
   see the overlay, so to avoid confusion let's standardize on it.
											 
										 
										
											2020-05-09 19:11:09 -04:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								You can then build and install this to your profile with:
							 
						 
					
						
							
								
									
										
										
										
											2020-02-09 11:23:11 -05:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2016-02-21 20:13:44 +01:00 
										
									 
								 
							 
							
								
							 
							
								 
							 
							
							
								```sh
							 
						 
					
						
							
								
									
										
											 
										 
										
											
												doc: Rewrite python onboarding tutorials in manual
Based on some feedback in #87094 and discussion with @fridh, this re-organizes
the onboarding tutorial in the Nixpkgs manual's python section, so that we start
with the simplest, most ad-hoc examples and work our way up. This progresses
from:
1. How to create an temporary python env at the cmdline, then
2. How to create a specific python env for a single script, then
3. How to create a specific python env for a project in a shell.nix, then
4. How to install a specific python env globally on the system or in a user profile.
Additionally, I've tried to standardize on some of the "best practice" ways of
doing things:
1. Instead of saying that this command style is "supported but strongly not
   discouraged", I've just deleted it to avoid confusion.
   Bad:  nix-shell -p python38Packages.numpy python38Packages.toolz
   Good: nix-shell -p 'python38.withPackages(ps: with ps; [ numpy toolz ])'
2. In the portion where we show how to add stuff to the user's
   `XDG_CONFIG_HOME`, use overlays instead of `config.nix`. The former can do
   everything the latter can do, but is also much more generic and powerful,
   because it can compose with other files, compose with other envs, compose
   with overlays that do things like swap whether tensorflow and pytorch are
   built openblas/mkl/cuda stacks, and so on. The user is eventually going to
   see the overlay, so to avoid confusion let's standardize on it.
											 
										 
										
											2020-05-09 19:11:09 -04:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								nix-env -iA myEnv
							 
						 
					
						
							
								
									
										
										
										
											2016-02-21 20:13:44 +01:00 
										
									 
								 
							 
							
								
							 
							
								 
							 
							
							
								```
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
											 
										 
										
											
												doc: Rewrite python onboarding tutorials in manual
Based on some feedback in #87094 and discussion with @fridh, this re-organizes
the onboarding tutorial in the Nixpkgs manual's python section, so that we start
with the simplest, most ad-hoc examples and work our way up. This progresses
from:
1. How to create an temporary python env at the cmdline, then
2. How to create a specific python env for a single script, then
3. How to create a specific python env for a project in a shell.nix, then
4. How to install a specific python env globally on the system or in a user profile.
Additionally, I've tried to standardize on some of the "best practice" ways of
doing things:
1. Instead of saying that this command style is "supported but strongly not
   discouraged", I've just deleted it to avoid confusion.
   Bad:  nix-shell -p python38Packages.numpy python38Packages.toolz
   Good: nix-shell -p 'python38.withPackages(ps: with ps; [ numpy toolz ])'
2. In the portion where we show how to add stuff to the user's
   `XDG_CONFIG_HOME`, use overlays instead of `config.nix`. The former can do
   everything the latter can do, but is also much more generic and powerful,
   because it can compose with other files, compose with other envs, compose
   with overlays that do things like swap whether tensorflow and pytorch are
   built openblas/mkl/cuda stacks, and so on. The user is eventually going to
   see the overlay, so to avoid confusion let's standardize on it.
											 
										 
										
											2020-05-09 19:11:09 -04:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								One limitation of this is that you can only have 1 Python env installed
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								globally, since they conflict on the `python`  to load out of your `PATH` .
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								If you get a conflict or prefer to keep the setup clean, you can have `nix-env` 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								atomically *uninstall*  all other imperatively installed packages and replace
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								your profile with just `myEnv`  by using the `--replace`  flag.
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								##### Environment defined in `/etc/nixos/configuration.nix`
 
							 
						 
					
						
							
								
									
										
										
										
											2016-02-21 20:13:44 +01:00 
										
									 
								 
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
											 
										 
										
											
												doc: Rewrite python onboarding tutorials in manual
Based on some feedback in #87094 and discussion with @fridh, this re-organizes
the onboarding tutorial in the Nixpkgs manual's python section, so that we start
with the simplest, most ad-hoc examples and work our way up. This progresses
from:
1. How to create an temporary python env at the cmdline, then
2. How to create a specific python env for a single script, then
3. How to create a specific python env for a project in a shell.nix, then
4. How to install a specific python env globally on the system or in a user profile.
Additionally, I've tried to standardize on some of the "best practice" ways of
doing things:
1. Instead of saying that this command style is "supported but strongly not
   discouraged", I've just deleted it to avoid confusion.
   Bad:  nix-shell -p python38Packages.numpy python38Packages.toolz
   Good: nix-shell -p 'python38.withPackages(ps: with ps; [ numpy toolz ])'
2. In the portion where we show how to add stuff to the user's
   `XDG_CONFIG_HOME`, use overlays instead of `config.nix`. The former can do
   everything the latter can do, but is also much more generic and powerful,
   because it can compose with other files, compose with other envs, compose
   with overlays that do things like swap whether tensorflow and pytorch are
   built openblas/mkl/cuda stacks, and so on. The user is eventually going to
   see the overlay, so to avoid confusion let's standardize on it.
											 
										 
										
											2020-05-09 19:11:09 -04:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								For the sake of completeness, here's how to install the environment system-wide
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								on NixOS.
							 
						 
					
						
							
								
									
										
										
										
											2016-02-21 20:13:44 +01:00 
										
									 
								 
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
											 
										 
										
											
												doc: Rewrite python onboarding tutorials in manual
Based on some feedback in #87094 and discussion with @fridh, this re-organizes
the onboarding tutorial in the Nixpkgs manual's python section, so that we start
with the simplest, most ad-hoc examples and work our way up. This progresses
from:
1. How to create an temporary python env at the cmdline, then
2. How to create a specific python env for a single script, then
3. How to create a specific python env for a project in a shell.nix, then
4. How to install a specific python env globally on the system or in a user profile.
Additionally, I've tried to standardize on some of the "best practice" ways of
doing things:
1. Instead of saying that this command style is "supported but strongly not
   discouraged", I've just deleted it to avoid confusion.
   Bad:  nix-shell -p python38Packages.numpy python38Packages.toolz
   Good: nix-shell -p 'python38.withPackages(ps: with ps; [ numpy toolz ])'
2. In the portion where we show how to add stuff to the user's
   `XDG_CONFIG_HOME`, use overlays instead of `config.nix`. The former can do
   everything the latter can do, but is also much more generic and powerful,
   because it can compose with other files, compose with other envs, compose
   with overlays that do things like swap whether tensorflow and pytorch are
   built openblas/mkl/cuda stacks, and so on. The user is eventually going to
   see the overlay, so to avoid confusion let's standardize on it.
											 
										 
										
											2020-05-09 19:11:09 -04:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								```nix
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								{ # ...
							 
						 
					
						
							
								
									
										
										
										
											2016-02-21 20:13:44 +01:00 
										
									 
								 
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
											 
										 
										
											
												doc: Rewrite python onboarding tutorials in manual
Based on some feedback in #87094 and discussion with @fridh, this re-organizes
the onboarding tutorial in the Nixpkgs manual's python section, so that we start
with the simplest, most ad-hoc examples and work our way up. This progresses
from:
1. How to create an temporary python env at the cmdline, then
2. How to create a specific python env for a single script, then
3. How to create a specific python env for a project in a shell.nix, then
4. How to install a specific python env globally on the system or in a user profile.
Additionally, I've tried to standardize on some of the "best practice" ways of
doing things:
1. Instead of saying that this command style is "supported but strongly not
   discouraged", I've just deleted it to avoid confusion.
   Bad:  nix-shell -p python38Packages.numpy python38Packages.toolz
   Good: nix-shell -p 'python38.withPackages(ps: with ps; [ numpy toolz ])'
2. In the portion where we show how to add stuff to the user's
   `XDG_CONFIG_HOME`, use overlays instead of `config.nix`. The former can do
   everything the latter can do, but is also much more generic and powerful,
   because it can compose with other files, compose with other envs, compose
   with overlays that do things like swap whether tensorflow and pytorch are
   built openblas/mkl/cuda stacks, and so on. The user is eventually going to
   see the overlay, so to avoid confusion let's standardize on it.
											 
										 
										
											2020-05-09 19:11:09 -04:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								  environment.systemPackages = with pkgs; [
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    (python38.withPackages(ps: with ps; [ numpy toolz ]))
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								  ];
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								}
							 
						 
					
						
							
								
									
										
										
										
											2016-02-21 20:13:44 +01:00 
										
									 
								 
							 
							
								
							 
							
								 
							 
							
							
								```
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								### Developing with Python
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
											 
										 
										
											
												doc: Rewrite python onboarding tutorials in manual
Based on some feedback in #87094 and discussion with @fridh, this re-organizes
the onboarding tutorial in the Nixpkgs manual's python section, so that we start
with the simplest, most ad-hoc examples and work our way up. This progresses
from:
1. How to create an temporary python env at the cmdline, then
2. How to create a specific python env for a single script, then
3. How to create a specific python env for a project in a shell.nix, then
4. How to install a specific python env globally on the system or in a user profile.
Additionally, I've tried to standardize on some of the "best practice" ways of
doing things:
1. Instead of saying that this command style is "supported but strongly not
   discouraged", I've just deleted it to avoid confusion.
   Bad:  nix-shell -p python38Packages.numpy python38Packages.toolz
   Good: nix-shell -p 'python38.withPackages(ps: with ps; [ numpy toolz ])'
2. In the portion where we show how to add stuff to the user's
   `XDG_CONFIG_HOME`, use overlays instead of `config.nix`. The former can do
   everything the latter can do, but is also much more generic and powerful,
   because it can compose with other files, compose with other envs, compose
   with overlays that do things like swap whether tensorflow and pytorch are
   built openblas/mkl/cuda stacks, and so on. The user is eventually going to
   see the overlay, so to avoid confusion let's standardize on it.
											 
										 
										
											2020-05-09 19:11:09 -04:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								Above, we were mostly just focused on use cases and what to do to get started
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								creating working Python environments in nix.
							 
						 
					
						
							
								
									
										
										
										
											2016-02-21 20:13:44 +01:00 
										
									 
								 
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
											 
										 
										
											
												doc: Rewrite python onboarding tutorials in manual
Based on some feedback in #87094 and discussion with @fridh, this re-organizes
the onboarding tutorial in the Nixpkgs manual's python section, so that we start
with the simplest, most ad-hoc examples and work our way up. This progresses
from:
1. How to create an temporary python env at the cmdline, then
2. How to create a specific python env for a single script, then
3. How to create a specific python env for a project in a shell.nix, then
4. How to install a specific python env globally on the system or in a user profile.
Additionally, I've tried to standardize on some of the "best practice" ways of
doing things:
1. Instead of saying that this command style is "supported but strongly not
   discouraged", I've just deleted it to avoid confusion.
   Bad:  nix-shell -p python38Packages.numpy python38Packages.toolz
   Good: nix-shell -p 'python38.withPackages(ps: with ps; [ numpy toolz ])'
2. In the portion where we show how to add stuff to the user's
   `XDG_CONFIG_HOME`, use overlays instead of `config.nix`. The former can do
   everything the latter can do, but is also much more generic and powerful,
   because it can compose with other files, compose with other envs, compose
   with overlays that do things like swap whether tensorflow and pytorch are
   built openblas/mkl/cuda stacks, and so on. The user is eventually going to
   see the overlay, so to avoid confusion let's standardize on it.
											 
										 
										
											2020-05-09 19:11:09 -04:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								Now that you know the basics to be up and running, it is time to take a step
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								back and take a deeper look at at how Python packages are packaged on Nix. Then,
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								we will look at how you can use development mode with your code.
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								#### Python library packages in Nixpkgs
 
							 
						 
					
						
							
								
									
										
										
										
											2016-02-21 20:13:44 +01:00 
										
									 
								 
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-08-26 11:21:30 +02:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								With Nix all packages are built by functions. The main function in Nix for
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								building Python libraries is `buildPythonPackage` . Let's see how we can build the
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								`toolz`  package.
							 
						 
					
						
							
								
									
										
										
										
											2016-02-21 20:13:44 +01:00 
										
									 
								 
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								```nix
							 
						 
					
						
							
								
									
										
										
										
											2018-10-09 20:42:29 -04:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								{ lib, buildPythonPackage, fetchPypi }:
							 
						 
					
						
							
								
									
										
										
										
											2016-02-21 20:13:44 +01:00 
										
									 
								 
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2019-03-18 20:01:54 -04:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								buildPythonPackage rec {
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								  pname = "toolz";
							 
						 
					
						
							
								
									
										
										
										
											2020-05-09 12:58:00 -04:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								  version = "0.10.0";
							 
						 
					
						
							
								
									
										
										
										
											2019-03-18 20:01:54 -04:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								  src = fetchPypi {
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    inherit pname version;
							 
						 
					
						
							
								
									
										
										
										
											2020-05-09 12:58:00 -04:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								    sha256 = "08fdd5ef7c96480ad11c12d472de21acd32359996f69a5259299b540feba4560";
							 
						 
					
						
							
								
									
										
										
										
											2016-02-21 20:13:44 +01:00 
										
									 
								 
							 
							
								
							 
							
								 
							 
							
							
								  };
							 
						 
					
						
							
								
									
										
										
										
											2019-03-18 20:01:54 -04:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								  doCheck = false;
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								  meta = with lib; {
							 
						 
					
						
							
								
									
										
										
										
											2020-02-16 08:31:03 -08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								    homepage = "https://github.com/pytoolz/toolz";
							 
						 
					
						
							
								
									
										
										
										
											2019-03-18 20:01:54 -04:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								    description = "List processing tools and functional utilities";
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    license = licenses.bsd3;
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    maintainers = with maintainers; [ fridh ];
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								  };
							 
						 
					
						
							
								
									
										
										
										
											2019-04-25 22:37:53 +02:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								}
							 
						 
					
						
							
								
									
										
										
										
											2016-02-21 20:13:44 +01:00 
										
									 
								 
							 
							
								
							 
							
								 
							 
							
							
								```
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								What happens here? The function `buildPythonPackage`  is called and as argument
							 
						 
					
						
							
								
									
										
										
										
											2017-08-26 11:21:30 +02:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								it accepts a set. In this case the set is a recursive set, `rec` . One of the
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								arguments is the name of the package, which consists of a basename (generally
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								following the name on PyPi) and a version. Another argument, `src`  specifies the
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								source, which in this case is fetched from PyPI using the helper function
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								`fetchPypi` . The argument `doCheck`  is used to set whether tests should be run
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								when building the package. Furthermore, we specify some (optional) meta
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								information. The output of the function is a derivation.
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								An expression for `toolz`  can be found in the Nixpkgs repository. As explained
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								in the introduction of this Python section, a derivation of `toolz`  is available
							 
						 
					
						
							
								
									
										
										
										
											2020-05-09 12:58:00 -04:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								for each interpreter version, e.g. `python38.pkgs.toolz`  refers to the `toolz` 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								derivation corresponding to the CPython 3.8 interpreter.
							 
						 
					
						
							
								
									
										
											 
										 
										
											
												doc: Rewrite python onboarding tutorials in manual
Based on some feedback in #87094 and discussion with @fridh, this re-organizes
the onboarding tutorial in the Nixpkgs manual's python section, so that we start
with the simplest, most ad-hoc examples and work our way up. This progresses
from:
1. How to create an temporary python env at the cmdline, then
2. How to create a specific python env for a single script, then
3. How to create a specific python env for a project in a shell.nix, then
4. How to install a specific python env globally on the system or in a user profile.
Additionally, I've tried to standardize on some of the "best practice" ways of
doing things:
1. Instead of saying that this command style is "supported but strongly not
   discouraged", I've just deleted it to avoid confusion.
   Bad:  nix-shell -p python38Packages.numpy python38Packages.toolz
   Good: nix-shell -p 'python38.withPackages(ps: with ps; [ numpy toolz ])'
2. In the portion where we show how to add stuff to the user's
   `XDG_CONFIG_HOME`, use overlays instead of `config.nix`. The former can do
   everything the latter can do, but is also much more generic and powerful,
   because it can compose with other files, compose with other envs, compose
   with overlays that do things like swap whether tensorflow and pytorch are
   built openblas/mkl/cuda stacks, and so on. The user is eventually going to
   see the overlay, so to avoid confusion let's standardize on it.
											 
										 
										
											2020-05-09 19:11:09 -04:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2016-02-21 20:13:44 +01:00 
										
									 
								 
							 
							
								
							 
							
								 
							 
							
							
								The above example works when you're directly working on
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								`pkgs/top-level/python-packages.nix`  in the Nixpkgs repository. Often though,
							 
						 
					
						
							
								
									
										
										
										
											2017-08-26 11:21:30 +02:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								you will want to test a Nix expression outside of the Nixpkgs tree.
							 
						 
					
						
							
								
									
										
										
										
											2016-02-21 20:13:44 +01:00 
										
									 
								 
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-08-26 11:21:30 +02:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								The following expression creates a derivation for the `toolz`  package,
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								and adds it along with a `numpy`  package to a Python environment.
							 
						 
					
						
							
								
									
										
										
										
											2016-02-21 20:13:44 +01:00 
										
									 
								 
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								```nix
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								with import < nixpkgs >  {};
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								( let
							 
						 
					
						
							
								
									
										
										
										
											2020-05-09 12:58:00 -04:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								    my_toolz = python38.pkgs.buildPythonPackage rec {
							 
						 
					
						
							
								
									
										
										
										
											2017-08-26 11:21:30 +02:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								      pname = "toolz";
							 
						 
					
						
							
								
									
										
										
										
											2020-05-09 12:58:00 -04:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								      version = "0.10.0";
							 
						 
					
						
							
								
									
										
										
										
											2017-08-26 11:21:30 +02:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2020-05-09 12:58:00 -04:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								      src = python38.pkgs.fetchPypi {
							 
						 
					
						
							
								
									
										
										
										
											2017-08-26 11:21:30 +02:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								        inherit pname version;
							 
						 
					
						
							
								
									
										
										
										
											2020-05-09 12:58:00 -04:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								        sha256 = "08fdd5ef7c96480ad11c12d472de21acd32359996f69a5259299b540feba4560";
							 
						 
					
						
							
								
									
										
										
										
											2016-02-21 20:13:44 +01:00 
										
									 
								 
							 
							
								
							 
							
								 
							 
							
							
								      };
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2016-12-21 15:44:50 +01:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								      doCheck = false;
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2016-02-21 20:13:44 +01:00 
										
									 
								 
							 
							
								
							 
							
								 
							 
							
							
								      meta = {
							 
						 
					
						
							
								
									
										
										
										
											2018-06-27 13:12:57 -07:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								        homepage = "https://github.com/pytoolz/toolz/";
							 
						 
					
						
							
								
									
										
										
										
											2016-02-21 20:13:44 +01:00 
										
									 
								 
							 
							
								
							 
							
								 
							 
							
							
								        description = "List processing tools and functional utilities";
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								      };
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    };
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2020-05-09 12:58:00 -04:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								  in python38.withPackages (ps: [ps.numpy my_toolz])
							 
						 
					
						
							
								
									
										
										
										
											2016-02-21 20:13:44 +01:00 
										
									 
								 
							 
							
								
							 
							
								 
							 
							
							
								).env
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								```
							 
						 
					
						
							
								
									
										
										
										
											2020-02-09 11:23:11 -05:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-08-26 11:21:30 +02:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								Executing `nix-shell`  will result in an environment in which you can use
							 
						 
					
						
							
								
									
										
										
										
											2020-05-09 12:58:00 -04:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								Python 3.8 and the `toolz`  package. As you can see we had to explicitly mention
							 
						 
					
						
							
								
									
										
										
										
											2017-08-26 11:21:30 +02:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								for which Python version we want to build a package.
							 
						 
					
						
							
								
									
										
										
										
											2016-02-21 20:13:44 +01:00 
										
									 
								 
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-08-26 11:21:30 +02:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								So, what did we do here? Well, we took the Nix expression that we used earlier
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								to build a Python environment, and said that we wanted to include our own
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								version of `toolz` , named `my_toolz` . To introduce our own package in the scope
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								of `withPackages`  we used a `let`  expression. You can see that we used
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								`ps.numpy`  to select numpy from the nixpkgs package set (`ps` ). We did not take
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								`toolz`  from the Nixpkgs package set this time, but instead took our own version
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								that we introduced with the `let`  expression.
							 
						 
					
						
							
								
									
										
										
										
											2016-02-21 20:13:44 +01:00 
										
									 
								 
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-08-26 11:21:30 +02:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								#### Handling dependencies
 
							 
						 
					
						
							
								
									
										
										
										
											2016-02-21 20:13:44 +01:00 
										
									 
								 
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2018-10-09 20:42:29 -04:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								Our example, `toolz` , does not have any dependencies on other Python packages or
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								system libraries. According to the manual, `buildPythonPackage`  uses the
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								arguments `buildInputs`  and `propagatedBuildInputs`  to specify dependencies. If
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								something is exclusively a build-time dependency, then the dependency should be
							 
						 
					
						
							
								
									
										
											 
										 
										
											
												doc: Rewrite python onboarding tutorials in manual
Based on some feedback in #87094 and discussion with @fridh, this re-organizes
the onboarding tutorial in the Nixpkgs manual's python section, so that we start
with the simplest, most ad-hoc examples and work our way up. This progresses
from:
1. How to create an temporary python env at the cmdline, then
2. How to create a specific python env for a single script, then
3. How to create a specific python env for a project in a shell.nix, then
4. How to install a specific python env globally on the system or in a user profile.
Additionally, I've tried to standardize on some of the "best practice" ways of
doing things:
1. Instead of saying that this command style is "supported but strongly not
   discouraged", I've just deleted it to avoid confusion.
   Bad:  nix-shell -p python38Packages.numpy python38Packages.toolz
   Good: nix-shell -p 'python38.withPackages(ps: with ps; [ numpy toolz ])'
2. In the portion where we show how to add stuff to the user's
   `XDG_CONFIG_HOME`, use overlays instead of `config.nix`. The former can do
   everything the latter can do, but is also much more generic and powerful,
   because it can compose with other files, compose with other envs, compose
   with overlays that do things like swap whether tensorflow and pytorch are
   built openblas/mkl/cuda stacks, and so on. The user is eventually going to
   see the overlay, so to avoid confusion let's standardize on it.
											 
										 
										
											2020-05-09 19:11:09 -04:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								included in `buildInputs` , but if it is (also) a runtime dependency, then it
							 
						 
					
						
							
								
									
										
										
										
											2018-10-09 20:42:29 -04:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								should be added to `propagatedBuildInputs` . Test dependencies are considered
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								build-time dependencies and passed to `checkInputs` .
							 
						 
					
						
							
								
									
										
										
										
											2016-02-21 20:13:44 +01:00 
										
									 
								 
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								The following example shows which arguments are given to `buildPythonPackage`  in
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								order to build [`datashape` ](https://github.com/blaze/datashape ).
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								```nix
							 
						 
					
						
							
								
									
										
										
										
											2019-03-24 05:29:53 -04:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								{ lib, buildPythonPackage, fetchPypi, numpy, multipledispatch, dateutil, pytest }:
							 
						 
					
						
							
								
									
										
										
										
											2016-02-21 20:13:44 +01:00 
										
									 
								 
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2019-03-22 22:50:30 -04:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								buildPythonPackage rec {
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								  pname = "datashape";
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								  version = "0.4.7";
							 
						 
					
						
							
								
									
										
										
										
											2016-02-21 20:13:44 +01:00 
										
									 
								 
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2019-03-22 22:50:30 -04:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								  src = fetchPypi {
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    inherit pname version;
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    sha256 = "14b2ef766d4c9652ab813182e866f493475e65e558bed0822e38bf07bba1a278";
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								  };
							 
						 
					
						
							
								
									
										
										
										
											2016-02-21 20:13:44 +01:00 
										
									 
								 
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2019-03-22 22:50:30 -04:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								  checkInputs = [ pytest ];
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								  propagatedBuildInputs = [ numpy multipledispatch dateutil ];
							 
						 
					
						
							
								
									
										
										
										
											2017-03-05 17:16:29 +01:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2019-03-22 22:50:30 -04:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								  meta = with lib; {
							 
						 
					
						
							
								
									
										
										
										
											2020-02-16 08:31:03 -08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								    homepage = "https://github.com/ContinuumIO/datashape";
							 
						 
					
						
							
								
									
										
										
										
											2019-03-22 22:50:30 -04:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								    description = "A data description language";
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    license = licenses.bsd2;
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    maintainers = with maintainers; [ fridh ];
							 
						 
					
						
							
								
									
										
										
										
											2016-02-21 20:13:44 +01:00 
										
									 
								 
							 
							
								
							 
							
								 
							 
							
							
								  };
							 
						 
					
						
							
								
									
										
										
										
											2017-03-05 17:16:29 +01:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								}
							 
						 
					
						
							
								
									
										
										
										
											2016-02-21 20:13:44 +01:00 
										
									 
								 
							 
							
								
							 
							
								 
							 
							
							
								```
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								We can see several runtime dependencies, `numpy` , `multipledispatch` , and
							 
						 
					
						
							
								
									
										
										
										
											2019-03-22 22:50:30 -04:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								`dateutil` . Furthermore, we have one `checkInputs` , i.e. `pytest` . `pytest`  is a
							 
						 
					
						
							
								
									
										
										
										
											2016-02-21 20:13:44 +01:00 
										
									 
								 
							 
							
								
							 
							
								 
							 
							
							
								test runner and is only used during the `checkPhase`  and is therefore not added
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								to `propagatedBuildInputs` .
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								In the previous case we had only dependencies on other Python packages to consider.
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								Occasionally you have also system libraries to consider. E.g., `lxml`  provides
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								Python bindings to `libxml2`  and `libxslt` . These libraries are only required
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								when building the bindings and are therefore added as `buildInputs` .
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								```nix
							 
						 
					
						
							
								
									
										
										
										
											2019-03-24 05:29:53 -04:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								{ lib, pkgs, buildPythonPackage, fetchPypi }:
							 
						 
					
						
							
								
									
										
										
										
											2016-02-21 20:13:44 +01:00 
										
									 
								 
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2019-03-22 22:50:30 -04:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								buildPythonPackage rec {
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								  pname = "lxml";
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								  version = "3.4.4";
							 
						 
					
						
							
								
									
										
										
										
											2016-02-21 20:13:44 +01:00 
										
									 
								 
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2019-03-22 22:50:30 -04:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								  src = fetchPypi {
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    inherit pname version;
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    sha256 = "16a0fa97hym9ysdk3rmqz32xdjqmy4w34ld3rm3jf5viqjx65lxk";
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								  };
							 
						 
					
						
							
								
									
										
										
										
											2016-02-21 20:13:44 +01:00 
										
									 
								 
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2019-03-22 22:50:30 -04:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								  buildInputs = [ pkgs.libxml2 pkgs.libxslt ];
							 
						 
					
						
							
								
									
										
										
										
											2017-03-05 17:16:29 +01:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2019-03-22 22:50:30 -04:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								  meta = with lib; {
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    description = "Pythonic binding for the libxml2 and libxslt libraries";
							 
						 
					
						
							
								
									
										
										
										
											2020-02-16 08:31:03 -08:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								    homepage = "https://lxml.de";
							 
						 
					
						
							
								
									
										
										
										
											2019-03-22 22:50:30 -04:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								    license = licenses.bsd3;
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    maintainers = with maintainers; [ sjourdois ];
							 
						 
					
						
							
								
									
										
										
										
											2016-02-21 20:13:44 +01:00 
										
									 
								 
							 
							
								
							 
							
								 
							 
							
							
								  };
							 
						 
					
						
							
								
									
										
										
										
											2017-03-05 17:16:29 +01:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								}
							 
						 
					
						
							
								
									
										
										
										
											2016-02-21 20:13:44 +01:00 
										
									 
								 
							 
							
								
							 
							
								 
							 
							
							
								```
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								In this example `lxml`  and Nix are able to work out exactly where the relevant
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								files of the dependencies are. This is not always the case.
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2020-02-09 11:23:11 -05:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								The example below shows bindings to The Fastest Fourier Transform in the West,
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								commonly known as FFTW. On Nix we have separate packages of FFTW for the
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								different types of floats (`"single"` , `"double"` , `"long-double"` ). The
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								bindings need all three types, and therefore we add all three as `buildInputs` .
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								The bindings don't expect to find each of them in a different folder, and
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								therefore we have to set `LDFLAGS`  and `CFLAGS` .
							 
						 
					
						
							
								
									
										
										
										
											2016-02-21 20:13:44 +01:00 
										
									 
								 
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								```nix
							 
						 
					
						
							
								
									
										
										
										
											2019-03-24 05:29:53 -04:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								{ lib, pkgs, buildPythonPackage, fetchPypi, numpy, scipy }:
							 
						 
					
						
							
								
									
										
										
										
											2016-02-21 20:13:44 +01:00 
										
									 
								 
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2019-03-22 22:50:30 -04:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								buildPythonPackage rec {
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								  pname = "pyFFTW";
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								  version = "0.9.2";
							 
						 
					
						
							
								
									
										
										
										
											2016-02-21 20:13:44 +01:00 
										
									 
								 
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2019-03-22 22:50:30 -04:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								  src = fetchPypi {
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    inherit pname version;
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    sha256 = "f6bbb6afa93085409ab24885a1a3cdb8909f095a142f4d49e346f2bd1b789074";
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								  };
							 
						 
					
						
							
								
									
										
										
										
											2016-02-21 20:13:44 +01:00 
										
									 
								 
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2019-03-22 22:50:30 -04:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								  buildInputs = [ pkgs.fftw pkgs.fftwFloat pkgs.fftwLongDouble];
							 
						 
					
						
							
								
									
										
										
										
											2016-02-21 20:13:44 +01:00 
										
									 
								 
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2019-03-22 22:50:30 -04:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								  propagatedBuildInputs = [ numpy scipy ];
							 
						 
					
						
							
								
									
										
										
										
											2016-02-21 20:13:44 +01:00 
										
									 
								 
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2019-03-22 22:50:30 -04:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								  # Tests cannot import pyfftw. pyfftw works fine though.
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								  doCheck = false;
							 
						 
					
						
							
								
									
										
										
										
											2016-02-21 20:13:44 +01:00 
										
									 
								 
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2019-03-22 22:50:30 -04:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								  preConfigure = ''
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    export LDFLAGS="-L${pkgs.fftw.dev}/lib -L${pkgs.fftwFloat.out}/lib -L${pkgs.fftwLongDouble.out}/lib"
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    export CFLAGS="-I${pkgs.fftw.dev}/include -I${pkgs.fftwFloat.dev}/include -I${pkgs.fftwLongDouble.dev}/include"
							 
						 
					
						
							
								
									
										
										
										
											2019-03-24 05:29:53 -04:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								  '';
							 
						 
					
						
							
								
									
										
										
										
											2017-03-05 17:16:29 +01:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2019-03-22 22:50:30 -04:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								  meta = with lib; {
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    description = "A pythonic wrapper around FFTW, the FFT library, presenting a unified interface for all the supported transforms";
							 
						 
					
						
							
								
									
										
										
										
											2020-04-18 13:43:47 +02:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								    homepage = "http://hgomersall.github.com/pyFFTW";
							 
						 
					
						
							
								
									
										
										
										
											2019-03-22 22:50:30 -04:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								    license = with licenses; [ bsd2 bsd3 ];
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    maintainers = with maintainers; [ fridh ];
							 
						 
					
						
							
								
									
										
										
										
											2016-02-21 20:13:44 +01:00 
										
									 
								 
							 
							
								
							 
							
								 
							 
							
							
								  };
							 
						 
					
						
							
								
									
										
										
										
											2017-03-05 17:16:29 +01:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								}
							 
						 
					
						
							
								
									
										
										
										
											2016-02-21 20:13:44 +01:00 
										
									 
								 
							 
							
								
							 
							
								 
							 
							
							
								```
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								Note also the line `doCheck = false;` , we explicitly disabled running the test-suite.
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2020-08-17 10:23:45 -07:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								#### Testing Python Packages
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								It is highly encouraged to have testing as part of the package build. This
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								helps to avoid situations where the package was able to build and install,
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								but is not usable at runtime. Currently, all packages will use the `test` 
							 
						 
					
						
							
								
									
										
										
										
											2020-08-17 13:33:43 -07:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								command provided by the setup.py (i.e. `python setup.py test` ). However,
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								this is currently deprecated https://github.com/pypa/setuptools/pull/1878
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								and your package should provide its own checkPhase.
							 
						 
					
						
							
								
									
										
										
										
											2020-08-17 10:23:45 -07:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								*NOTE:* The `checkPhase`  for python maps to the `installCheckPhase`  on a
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								normal derivation. This is due to many python packages not behaving well
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								to the pre-installed version of the package. Version info, and natively
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								compiled extensions generally only exist in the install directory, and
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								thus can cause issues when a test suite asserts on that behavior.
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								*NOTE:* Tests should only be disabled if they don't agree with nix
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								(e.g. external dependencies, network access, flakey tests), however,
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								as many tests should be enabled as possible. Failing tests can still be
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								a good indication that the package is not in a valid state.
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								#### Using pytest
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								Pytest is the most common test runner for python repositories. A trivial
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								test run would be:
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								```
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								  checkInputs = [ pytest ];
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								  checkPhase = "pytest";
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								```
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2020-09-21 09:31:16 +10:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								However, many repositories' test suites do not translate well to nix's build
							 
						 
					
						
							
								
									
										
										
										
											2020-08-17 10:23:45 -07:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								sandbox, and will generally need many tests to be disabled.
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								To filter tests using pytest, one can do the following:
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								```
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								  checkInputs = [ pytest ];
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								  # avoid tests which need additional data or touch network
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								  checkPhase = ''
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    pytest tests/ --ignore=tests/integration -k 'not download and not update'
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								  '';
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								```
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								`--ignore`  will tell pytest to ignore that file or directory from being
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								collected as part of a test run. This is useful is a file uses a package
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								which is not available in nixpkgs, thus skipping that test file is much
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								easier than having to create a new package.
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								`-k`  is used to define a predicate for test names. In this example, we are
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								filtering out tests which contain `download`  or `update`  in their test case name.
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								Only one `-k`  argument is allows, and thus a long predicate should be concatenated
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								with "\" and wrapped to the next line.
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								*NOTE:* In pytest==6.0.1, the use of "\" to continue a line (e.g. `-k 'not download \'` ) has
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								been removed, in this case, it's recommended to use `pytestCheckHook` .
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								#### Using pytestCheckHook
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								`pytestCheckHook`  is a convenient hook which will substitute the setuptools
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								`test`  command for a checkPhase which runs `pytest` . This is also beneficial
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								when a package may need many items disabled to run the test suite.
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								Using the example above, the analagous pytestCheckHook usage would be:
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								```
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								  checkInputs = [ pytestCheckHook ];
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								  # requires additional data
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								  pytestFlagsArray = [ "tests/" "--ignore=tests/integration" ];
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								  disabledTests = [
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    # touches network
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    "download"
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    "update"
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								  ];
							 
						 
					
						
							
								
									
										
										
										
											2021-01-06 00:32:27 +01:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								  disabledTestFiles = [
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    "tests/test_failing.py"
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								  ];
							 
						 
					
						
							
								
									
										
										
										
											2020-08-17 10:23:45 -07:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								```
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								This is expecially useful when tests need to be conditionallydisabled,
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								for example:
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								```
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								  disabledTests = [
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    # touches network
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    "download"
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    "update"
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								  ] ++ lib.optionals (pythonAtLeast "3.8") [
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    # broken due to python3.8 async changes
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    "async"
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								  ] ++ lib.optionals stdenv.isDarwin [
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    # can fail when building with other packages
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    "socket"
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								  ];
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								```
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								Trying to concatenate the related strings to disable tests in a regular checkPhase
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								would be much harder to read. This also enables us to comment on why specific tests
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								are disabled.
							 
						 
					
						
							
								
									
										
										
										
											2016-02-21 20:13:44 +01:00 
										
									 
								 
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2020-08-17 13:33:43 -07:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								#### Using pythonImportsCheck
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								Although unit tests are highly prefered to valid correctness of a package. Not
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								all packages have test suites that can be ran easily, and some have none at all.
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								To help ensure the package still works, `pythonImportsCheck`  can attempt to import
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								the listed modules.
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								```
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								  pythonImportsCheck = [ "requests" "urllib" ];
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								```
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								roughly translates to:
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								```
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								  postCheck = ''
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    PYTHONPATH=$out/${python.sitePackages}:$PYTHONPATH
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    python -c "import requests; import urllib"
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								  '';
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								```
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								However, this is done in it's own phase, and not dependent on whether `doCheck = true;` 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								This can also be useful in verifying that the package doesn't assume commonly
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								present packages (e.g. `setuptools` )
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								### Develop local package
 
							 
						 
					
						
							
								
									
										
										
										
											2016-02-21 20:13:44 +01:00 
										
									 
								 
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
											 
										 
										
											
												doc: Rewrite python onboarding tutorials in manual
Based on some feedback in #87094 and discussion with @fridh, this re-organizes
the onboarding tutorial in the Nixpkgs manual's python section, so that we start
with the simplest, most ad-hoc examples and work our way up. This progresses
from:
1. How to create an temporary python env at the cmdline, then
2. How to create a specific python env for a single script, then
3. How to create a specific python env for a project in a shell.nix, then
4. How to install a specific python env globally on the system or in a user profile.
Additionally, I've tried to standardize on some of the "best practice" ways of
doing things:
1. Instead of saying that this command style is "supported but strongly not
   discouraged", I've just deleted it to avoid confusion.
   Bad:  nix-shell -p python38Packages.numpy python38Packages.toolz
   Good: nix-shell -p 'python38.withPackages(ps: with ps; [ numpy toolz ])'
2. In the portion where we show how to add stuff to the user's
   `XDG_CONFIG_HOME`, use overlays instead of `config.nix`. The former can do
   everything the latter can do, but is also much more generic and powerful,
   because it can compose with other files, compose with other envs, compose
   with overlays that do things like swap whether tensorflow and pytorch are
   built openblas/mkl/cuda stacks, and so on. The user is eventually going to
   see the overlay, so to avoid confusion let's standardize on it.
											 
										 
										
											2020-05-09 19:11:09 -04:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								As a Python developer you're likely aware of [development mode ](http://setuptools.readthedocs.io/en/latest/setuptools.html#development-mode )
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								(`python setup.py develop` ); instead of installing the package this command
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								creates a special link to the project code. That way, you can run updated code
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								without having to reinstall after each and every change you make. Development
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								mode is also available. Let's see how you can use it.
							 
						 
					
						
							
								
									
										
										
										
											2016-02-21 20:13:44 +01:00 
										
									 
								 
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2020-02-09 11:23:11 -05:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								In the previous Nix expression the source was fetched from an url. We can also
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								refer to a local source instead using `src = ./path/to/source/tree;` 
							 
						 
					
						
							
								
									
										
										
										
											2016-02-21 20:13:44 +01:00 
										
									 
								 
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								If we create a `shell.nix`  file which calls `buildPythonPackage` , and if `src` 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								is a local source, and if the local source has a `setup.py` , then development
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								mode is activated.
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2020-05-09 12:58:00 -04:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								In the following example we create a simple environment that has a Python 3.8
							 
						 
					
						
							
								
									
										
										
										
											2020-02-09 11:23:11 -05:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								version of our package in it, as well as its dependencies and other packages we
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								like to have in the environment, all specified with `propagatedBuildInputs` .
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								Indeed, we can just add any package we like to have in our environment to
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								`propagatedBuildInputs` .
							 
						 
					
						
							
								
									
										
										
										
											2016-02-21 20:13:44 +01:00 
										
									 
								 
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								```nix
							 
						 
					
						
							
								
									
										
										
										
											2017-08-06 10:18:36 +02:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								with import < nixpkgs >  {};
							 
						 
					
						
							
								
									
										
										
										
											2020-05-09 12:58:00 -04:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								with python38Packages;
							 
						 
					
						
							
								
									
										
										
										
											2016-02-21 20:13:44 +01:00 
										
									 
								 
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								buildPythonPackage rec {
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								  name = "mypackage";
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								  src = ./path/to/package/source;
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								  propagatedBuildInputs = [ pytest numpy pkgs.libsndfile ];
							 
						 
					
						
							
								
									
										
										
										
											2017-03-05 17:16:29 +01:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								}
							 
						 
					
						
							
								
									
										
										
										
											2016-02-21 20:13:44 +01:00 
										
									 
								 
							 
							
								
							 
							
								 
							 
							
							
								```
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2020-02-09 11:23:11 -05:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								It is important to note that due to how development mode is implemented on Nix
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								it is not possible to have multiple packages simultaneously in development mode.
							 
						 
					
						
							
								
									
										
										
										
											2016-02-21 20:13:44 +01:00 
										
									 
								 
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								### Organising your packages
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								So far we discussed how you can use Python on Nix, and how you can develop with
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								it. We've looked at how you write expressions to package Python packages, and we
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								looked at how you can create environments in which specified packages are
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								available.
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								At some point you'll likely have multiple packages which you would
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								like to be able to use in different projects. In order to minimise unnecessary
							 
						 
					
						
							
								
									
										
										
										
											2018-07-26 14:19:45 +02:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								duplication we now look at how you can maintain a repository with your
							 
						 
					
						
							
								
									
										
										
										
											2016-02-21 20:13:44 +01:00 
										
									 
								 
							 
							
								
							 
							
								 
							 
							
							
								own packages. The important functions here are `import`  and `callPackage` .
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								### Including a derivation using `callPackage`
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2016-05-29 16:30:29 +02:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								Earlier we created a Python environment using `withPackages` , and included the
							 
						 
					
						
							
								
									
										
										
										
											2016-02-21 20:13:44 +01:00 
										
									 
								 
							 
							
								
							 
							
								 
							 
							
							
								`toolz`  package via a `let`  expression.
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								Let's split the package definition from the environment definition.
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								We first create a function that builds `toolz`  in `~/path/to/toolz/release.nix` 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								```nix
							 
						 
					
						
							
								
									
										
										
										
											2019-03-24 05:33:07 -04:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								{ lib, buildPythonPackage }:
							 
						 
					
						
							
								
									
										
										
										
											2016-02-21 20:13:44 +01:00 
										
									 
								 
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								buildPythonPackage rec {
							 
						 
					
						
							
								
									
										
										
										
											2018-01-16 17:59:30 +01:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								  pname = "toolz";
							 
						 
					
						
							
								
									
										
											 
										 
										
											
												doc: Rewrite python onboarding tutorials in manual
Based on some feedback in #87094 and discussion with @fridh, this re-organizes
the onboarding tutorial in the Nixpkgs manual's python section, so that we start
with the simplest, most ad-hoc examples and work our way up. This progresses
from:
1. How to create an temporary python env at the cmdline, then
2. How to create a specific python env for a single script, then
3. How to create a specific python env for a project in a shell.nix, then
4. How to install a specific python env globally on the system or in a user profile.
Additionally, I've tried to standardize on some of the "best practice" ways of
doing things:
1. Instead of saying that this command style is "supported but strongly not
   discouraged", I've just deleted it to avoid confusion.
   Bad:  nix-shell -p python38Packages.numpy python38Packages.toolz
   Good: nix-shell -p 'python38.withPackages(ps: with ps; [ numpy toolz ])'
2. In the portion where we show how to add stuff to the user's
   `XDG_CONFIG_HOME`, use overlays instead of `config.nix`. The former can do
   everything the latter can do, but is also much more generic and powerful,
   because it can compose with other files, compose with other envs, compose
   with overlays that do things like swap whether tensorflow and pytorch are
   built openblas/mkl/cuda stacks, and so on. The user is eventually going to
   see the overlay, so to avoid confusion let's standardize on it.
											 
										 
										
											2020-05-09 19:11:09 -04:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								  version = "0.10.0";
							 
						 
					
						
							
								
									
										
										
										
											2016-02-21 20:13:44 +01:00 
										
									 
								 
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2018-01-16 17:59:30 +01:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								  src = fetchPypi {
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    inherit pname version;
							 
						 
					
						
							
								
									
										
											 
										 
										
											
												doc: Rewrite python onboarding tutorials in manual
Based on some feedback in #87094 and discussion with @fridh, this re-organizes
the onboarding tutorial in the Nixpkgs manual's python section, so that we start
with the simplest, most ad-hoc examples and work our way up. This progresses
from:
1. How to create an temporary python env at the cmdline, then
2. How to create a specific python env for a single script, then
3. How to create a specific python env for a project in a shell.nix, then
4. How to install a specific python env globally on the system or in a user profile.
Additionally, I've tried to standardize on some of the "best practice" ways of
doing things:
1. Instead of saying that this command style is "supported but strongly not
   discouraged", I've just deleted it to avoid confusion.
   Bad:  nix-shell -p python38Packages.numpy python38Packages.toolz
   Good: nix-shell -p 'python38.withPackages(ps: with ps; [ numpy toolz ])'
2. In the portion where we show how to add stuff to the user's
   `XDG_CONFIG_HOME`, use overlays instead of `config.nix`. The former can do
   everything the latter can do, but is also much more generic and powerful,
   because it can compose with other files, compose with other envs, compose
   with overlays that do things like swap whether tensorflow and pytorch are
   built openblas/mkl/cuda stacks, and so on. The user is eventually going to
   see the overlay, so to avoid confusion let's standardize on it.
											 
										 
										
											2020-05-09 19:11:09 -04:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								    sha256 = "08fdd5ef7c96480ad11c12d472de21acd32359996f69a5259299b540feba4560";
							 
						 
					
						
							
								
									
										
										
										
											2016-02-21 20:13:44 +01:00 
										
									 
								 
							 
							
								
							 
							
								 
							 
							
							
								  };
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2018-07-03 17:19:18 +02:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								  meta = with lib; {
							 
						 
					
						
							
								
									
										
										
										
											2019-04-22 10:14:28 +02:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								    homepage = "https://github.com/pytoolz/toolz/";
							 
						 
					
						
							
								
									
										
										
										
											2016-02-21 20:13:44 +01:00 
										
									 
								 
							 
							
								
							 
							
								 
							 
							
							
								    description = "List processing tools and functional utilities";
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    license = licenses.bsd3;
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    maintainers = with maintainers; [ fridh ];
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								  };
							 
						 
					
						
							
								
									
										
										
										
											2017-03-05 17:16:29 +01:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								}
							 
						 
					
						
							
								
									
										
										
										
											2016-02-21 20:13:44 +01:00 
										
									 
								 
							 
							
								
							 
							
								 
							 
							
							
								```
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
											 
										 
										
											
												doc: Rewrite python onboarding tutorials in manual
Based on some feedback in #87094 and discussion with @fridh, this re-organizes
the onboarding tutorial in the Nixpkgs manual's python section, so that we start
with the simplest, most ad-hoc examples and work our way up. This progresses
from:
1. How to create an temporary python env at the cmdline, then
2. How to create a specific python env for a single script, then
3. How to create a specific python env for a project in a shell.nix, then
4. How to install a specific python env globally on the system or in a user profile.
Additionally, I've tried to standardize on some of the "best practice" ways of
doing things:
1. Instead of saying that this command style is "supported but strongly not
   discouraged", I've just deleted it to avoid confusion.
   Bad:  nix-shell -p python38Packages.numpy python38Packages.toolz
   Good: nix-shell -p 'python38.withPackages(ps: with ps; [ numpy toolz ])'
2. In the portion where we show how to add stuff to the user's
   `XDG_CONFIG_HOME`, use overlays instead of `config.nix`. The former can do
   everything the latter can do, but is also much more generic and powerful,
   because it can compose with other files, compose with other envs, compose
   with overlays that do things like swap whether tensorflow and pytorch are
   built openblas/mkl/cuda stacks, and so on. The user is eventually going to
   see the overlay, so to avoid confusion let's standardize on it.
											 
										 
										
											2020-05-09 19:11:09 -04:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								It takes an argument `buildPythonPackage` . We now call this function using
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								`callPackage`  in the definition of our environment
							 
						 
					
						
							
								
									
										
										
										
											2016-02-21 20:13:44 +01:00 
										
									 
								 
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								```nix
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								with import < nixpkgs >  {};
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								( let
							 
						 
					
						
							
								
									
										
										
										
											2019-03-24 05:33:07 -04:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								    toolz = callPackage /path/to/toolz/release.nix {
							 
						 
					
						
							
								
									
										
										
										
											2020-05-09 12:58:00 -04:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								      buildPythonPackage = python38Packages.buildPythonPackage;
							 
						 
					
						
							
								
									
										
										
										
											2017-03-05 17:16:29 +01:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								    };
							 
						 
					
						
							
								
									
										
										
										
											2020-05-09 12:58:00 -04:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								  in python38.withPackages (ps: [ ps.numpy toolz ])
							 
						 
					
						
							
								
									
										
										
										
											2016-02-21 20:13:44 +01:00 
										
									 
								 
							 
							
								
							 
							
								 
							 
							
							
								).env
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								```
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								Important to remember is that the Python version for which the package is made
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								depends on the `python`  derivation that is passed to `buildPythonPackage` . Nix
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								tries to automatically pass arguments when possible, which is why generally you
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								don't explicitly define which `python`  derivation should be used. In the above
							 
						 
					
						
							
								
									
										
										
										
											2020-05-09 12:58:00 -04:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								example we use `buildPythonPackage`  that is part of the set `python38Packages` ,
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								and in this case the `python38`  interpreter is automatically used.
							 
						 
					
						
							
								
									
										
										
										
											2016-02-21 20:13:44 +01:00 
										
									 
								 
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								## Reference
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								### Interpreters
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2020-10-13 18:53:40 +02:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								Versions 2.7, 3.6, 3.7, 3.8 and 3.9 of the CPython interpreter are available as
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								respectively `python27` , `python36` , `python37` , `python38`  and `python39` . The
							 
						 
					
						
							
								
									
										
										
										
											2020-02-09 11:23:11 -05:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								aliases `python2`  and `python3`  correspond to respectively `python27`  and
							 
						 
					
						
							
								
									
										
										
										
											2020-06-04 18:03:57 +02:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								`python38` . The default interpreter, `python` , maps to `python2` . The PyPy
							 
						 
					
						
							
								
									
										
										
										
											2018-05-15 01:46:47 -04:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								interpreters compatible with Python 2.7 and 3 are available as `pypy27`  and
							 
						 
					
						
							
								
									
										
										
										
											2020-02-09 11:23:11 -05:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								`pypy3` , with aliases `pypy2`  mapping to `pypy27`  and `pypy`  mapping to `pypy2` .
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								The Nix expressions for the interpreters can be found in
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								`pkgs/development/interpreters/python` .
							 
						 
					
						
							
								
									
										
										
										
											2016-02-21 20:13:44 +01:00 
										
									 
								 
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								All packages depending on any Python interpreter get appended
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								`out/{python.sitePackages}`  to `$PYTHONPATH`  if such directory
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								exists.
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2016-10-10 09:54:29 +02:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								#### Missing `tkinter` module standard library
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2016-10-14 17:49:51 +02:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								To reduce closure size the `Tkinter` /`tkinter`  is available as a separate package, `pythonPackages.tkinter` .
							 
						 
					
						
							
								
									
										
										
										
											2016-10-10 09:54:29 +02:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2016-02-21 20:13:44 +01:00 
										
									 
								 
							 
							
								
							 
							
								 
							 
							
							
								#### Attributes on interpreters packages
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								Each interpreter has the following attributes:
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								-  `libPrefix` . Name of the folder in `${python}/lib/`  for corresponding interpreter.
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								-  `interpreter` . Alias for `${python}/bin/${executable}` .
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								-  `buildEnv` . Function to build python interpreter environments with extra packages bundled together. See section *python.buildEnv function*  for usage and documentation.
							 
						 
					
						
							
								
									
										
										
										
											2016-05-29 16:30:29 +02:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								-  `withPackages` . Simpler interface to `buildEnv` . See section *python.withPackages function*  for usage and documentation.
							 
						 
					
						
							
								
									
										
										
										
											2016-02-21 20:13:44 +01:00 
										
									 
								 
							 
							
								
							 
							
								 
							 
							
							
								-  `sitePackages` . Alias for `lib/${libPrefix}/site-packages` .
							 
						 
					
						
							
								
									
										
											 
										 
										
											
												doc: Rewrite python onboarding tutorials in manual
Based on some feedback in #87094 and discussion with @fridh, this re-organizes
the onboarding tutorial in the Nixpkgs manual's python section, so that we start
with the simplest, most ad-hoc examples and work our way up. This progresses
from:
1. How to create an temporary python env at the cmdline, then
2. How to create a specific python env for a single script, then
3. How to create a specific python env for a project in a shell.nix, then
4. How to install a specific python env globally on the system or in a user profile.
Additionally, I've tried to standardize on some of the "best practice" ways of
doing things:
1. Instead of saying that this command style is "supported but strongly not
   discouraged", I've just deleted it to avoid confusion.
   Bad:  nix-shell -p python38Packages.numpy python38Packages.toolz
   Good: nix-shell -p 'python38.withPackages(ps: with ps; [ numpy toolz ])'
2. In the portion where we show how to add stuff to the user's
   `XDG_CONFIG_HOME`, use overlays instead of `config.nix`. The former can do
   everything the latter can do, but is also much more generic and powerful,
   because it can compose with other files, compose with other envs, compose
   with overlays that do things like swap whether tensorflow and pytorch are
   built openblas/mkl/cuda stacks, and so on. The user is eventually going to
   see the overlay, so to avoid confusion let's standardize on it.
											 
										 
										
											2020-05-09 19:11:09 -04:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								-  `executable` . Name of the interpreter executable, e.g. `python3.8` .
							 
						 
					
						
							
								
									
										
										
										
											2016-12-04 11:55:25 +01:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								-  `pkgs` . Set of Python packages for that specific interpreter. The package set can be modified by overriding the interpreter and passing `packageOverrides` .
							 
						 
					
						
							
								
									
										
										
										
											2016-02-21 20:13:44 +01:00 
										
									 
								 
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								### Building packages and applications
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2016-12-04 10:16:14 +01:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								Python libraries and applications that use `setuptools`  or
							 
						 
					
						
							
								
									
										
										
										
											2019-04-23 10:37:10 +01:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								`distutils`  are typically built with respectively the `buildPythonPackage`  and
							 
						 
					
						
							
								
									
										
										
										
											2016-12-04 10:16:14 +01:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								`buildPythonApplication`  functions. These two functions also support installing a `wheel` .
							 
						 
					
						
							
								
									
										
										
										
											2016-02-21 20:13:44 +01:00 
										
									 
								 
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								All Python packages reside in `pkgs/top-level/python-packages.nix`  and all
							 
						 
					
						
							
								
									
										
										
										
											2020-02-09 11:23:11 -05:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								applications elsewhere. In case a package is used as both a library and an
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								application, then the package should be in `pkgs/top-level/python-packages.nix` 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								since only those packages are made available for all interpreter versions. The
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								preferred location for library expressions is in
							 
						 
					
						
							
								
									
										
										
										
											2016-02-21 20:13:44 +01:00 
										
									 
								 
							 
							
								
							 
							
								 
							 
							
							
								`pkgs/development/python-modules` . It is important that these packages are
							 
						 
					
						
							
								
									
										
										
										
											2016-12-04 10:16:14 +01:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								called from `pkgs/top-level/python-packages.nix`  and not elsewhere, to guarantee
							 
						 
					
						
							
								
									
										
										
										
											2016-02-21 20:13:44 +01:00 
										
									 
								 
							 
							
								
							 
							
								 
							 
							
							
								the right version of the package is built.
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								Based on the packages defined in `pkgs/top-level/python-packages.nix`  an
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								attribute set is created for each available Python interpreter. The available
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								sets are
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								*  `pkgs.python27Packages` 
							 
						 
					
						
							
								
									
										
										
										
											2017-03-21 10:42:58 +01:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								*  `pkgs.python36Packages` 
							 
						 
					
						
							
								
									
										
										
										
											2018-01-24 16:10:08 +01:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								*  `pkgs.python37Packages` 
							 
						 
					
						
							
								
									
										
										
										
											2020-08-12 21:57:40 -07:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								*  `pkgs.python38Packages` 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								*  `pkgs.python39Packages` 
							 
						 
					
						
							
								
									
										
										
										
											2016-02-21 20:13:44 +01:00 
										
									 
								 
							 
							
								
							 
							
								 
							 
							
							
								*  `pkgs.pypyPackages` 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								and the aliases
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2016-10-18 10:29:22 +02:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								*  `pkgs.python2Packages`  pointing to `pkgs.python27Packages` 
							 
						 
					
						
							
								
									
										
										
										
											2020-08-12 21:57:40 -07:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								*  `pkgs.python3Packages`  pointing to `pkgs.python38Packages` 
							 
						 
					
						
							
								
									
										
										
										
											2016-12-04 10:16:14 +01:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								*  `pkgs.pythonPackages`  pointing to `pkgs.python2Packages` 
							 
						 
					
						
							
								
									
										
										
										
											2016-02-21 20:13:44 +01:00 
										
									 
								 
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								#### `buildPythonPackage` function
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								The `buildPythonPackage`  function is implemented in
							 
						 
					
						
							
								
									
										
										
										
											2019-07-17 20:36:47 +02:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								`pkgs/development/interpreters/python/mk-python-derivation` 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								using setup hooks.
							 
						 
					
						
							
								
									
										
										
										
											2016-02-21 20:13:44 +01:00 
										
									 
								 
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2016-12-04 10:16:14 +01:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								The following is an example:
							 
						 
					
						
							
								
									
										
										
										
											2020-02-09 11:23:11 -05:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-03-05 17:16:29 +01:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								```nix
							 
						 
					
						
							
								
									
										
										
										
											2018-10-09 20:42:29 -04:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								{ lib, buildPythonPackage, fetchPypi, hypothesis, setuptools_scm, attrs, py, setuptools, six, pluggy }:
							 
						 
					
						
							
								
									
										
										
										
											2016-02-21 20:13:44 +01:00 
										
									 
								 
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2018-01-16 17:59:30 +01:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								buildPythonPackage rec {
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								  pname = "pytest";
							 
						 
					
						
							
								
									
										
										
										
											2018-10-09 20:42:29 -04:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								  version = "3.3.1";
							 
						 
					
						
							
								
									
										
										
										
											2016-02-21 20:13:44 +01:00 
										
									 
								 
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2018-01-16 17:59:30 +01:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								  src = fetchPypi {
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    inherit pname version;
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    sha256 = "cf8436dc59d8695346fcd3ab296de46425ecab00d64096cebe79fb51ecb2eb93";
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								  };
							 
						 
					
						
							
								
									
										
										
										
											2016-02-21 20:13:44 +01:00 
										
									 
								 
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2018-10-11 20:18:33 +00:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								  postPatch = ''
							 
						 
					
						
							
								
									
										
										
										
											2018-10-09 20:42:29 -04:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								    # don't test bash builtins
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    rm testing/test_argcomplete.py
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								  '';
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2018-01-16 17:59:30 +01:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								  checkInputs = [ hypothesis ];
							 
						 
					
						
							
								
									
										
										
										
											2019-03-22 22:50:30 -04:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								  nativeBuildInputs = [ setuptools_scm ];
							 
						 
					
						
							
								
									
										
										
										
											2018-01-16 17:59:30 +01:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								  propagatedBuildInputs = [ attrs py setuptools six pluggy ];
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2018-10-09 20:42:29 -04:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								  meta = with lib; {
							 
						 
					
						
							
								
									
										
										
										
											2018-01-16 17:59:30 +01:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								    maintainers = with maintainers; [ domenkozar lovek323 madjar lsix ];
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    description = "Framework for writing tests";
							 
						 
					
						
							
								
									
										
										
										
											2017-03-05 17:16:29 +01:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								  };
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								}
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								```
							 
						 
					
						
							
								
									
										
										
										
											2016-02-21 20:13:44 +01:00 
										
									 
								 
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								The `buildPythonPackage`  mainly does four things:
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2016-08-15 12:35:32 +03:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								*  In the `buildPhase` , it calls `${python.interpreter} setup.py bdist_wheel`  to
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								  build a wheel binary zipfile.
							 
						 
					
						
							
								
									
										
										
										
											2016-02-21 20:13:44 +01:00 
										
									 
								 
							 
							
								
							 
							
								 
							 
							
							
								*  In the `installPhase` , it installs the wheel file using `pip install *.whl` .
							 
						 
					
						
							
								
									
										
										
										
											2016-08-15 12:35:32 +03:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								*  In the `postFixup`  phase, the `wrapPythonPrograms`  bash function is called to
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								  wrap all programs in the `$out/bin/*`  directory to include `$PATH` 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								  environment variable and add dependent libraries to script's `sys.path` .
							 
						 
					
						
							
								
									
										
										
										
											2016-02-21 20:13:44 +01:00 
										
									 
								 
							 
							
								
							 
							
								 
							 
							
							
								*  In the `installCheck`  phase, `${python.interpreter} setup.py test`  is ran.
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								By default tests are run because `doCheck = true` . Test dependencies, like
							 
						 
					
						
							
								
									
										
										
										
											2018-05-30 19:07:02 +02:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								e.g. the test runner, should be added to `checkInputs` .
							 
						 
					
						
							
								
									
										
										
										
											2016-02-21 20:13:44 +01:00 
										
									 
								 
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								By default `meta.platforms`  is set to the same value
							 
						 
					
						
							
								
									
										
										
										
											2017-09-01 13:38:07 -04:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								as the interpreter unless overridden otherwise.
							 
						 
					
						
							
								
									
										
										
										
											2016-02-21 20:13:44 +01:00 
										
									 
								 
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								##### `buildPythonPackage` parameters
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2020-02-09 11:23:11 -05:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								All parameters from `stdenv.mkDerivation`  function are still supported. The
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								following are specific to `buildPythonPackage` :
							 
						 
					
						
							
								
									
										
										
										
											2018-05-30 19:07:02 +02:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2020-02-09 11:23:11 -05:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								*  `catchConflicts ? true` : If `true` , abort package build if a package name
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								  appears more than once in dependency tree. Default is `true` .
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								*  `disabled`  ? false: If `true` , package is not built for the particular Python
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								  interpreter version.
							 
						 
					
						
							
								
									
										
											 
										 
										
											
												doc: Rewrite python onboarding tutorials in manual
Based on some feedback in #87094 and discussion with @fridh, this re-organizes
the onboarding tutorial in the Nixpkgs manual's python section, so that we start
with the simplest, most ad-hoc examples and work our way up. This progresses
from:
1. How to create an temporary python env at the cmdline, then
2. How to create a specific python env for a single script, then
3. How to create a specific python env for a project in a shell.nix, then
4. How to install a specific python env globally on the system or in a user profile.
Additionally, I've tried to standardize on some of the "best practice" ways of
doing things:
1. Instead of saying that this command style is "supported but strongly not
   discouraged", I've just deleted it to avoid confusion.
   Bad:  nix-shell -p python38Packages.numpy python38Packages.toolz
   Good: nix-shell -p 'python38.withPackages(ps: with ps; [ numpy toolz ])'
2. In the portion where we show how to add stuff to the user's
   `XDG_CONFIG_HOME`, use overlays instead of `config.nix`. The former can do
   everything the latter can do, but is also much more generic and powerful,
   because it can compose with other files, compose with other envs, compose
   with overlays that do things like swap whether tensorflow and pytorch are
   built openblas/mkl/cuda stacks, and so on. The user is eventually going to
   see the overlay, so to avoid confusion let's standardize on it.
											 
										 
										
											2020-05-09 19:11:09 -04:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								*  `dontWrapPythonPrograms ? false` : Skip wrapping of Python programs.
							 
						 
					
						
							
								
									
										
										
										
											2020-02-09 11:23:11 -05:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								*  `permitUserSite ? false` : Skip setting the `PYTHONNOUSERSITE`  environment
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								  variable in wrapped programs.
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								*  `format ? "setuptools"` : Format of the source. Valid options are
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								  `"setuptools"` , `"pyproject"` , `"flit"` , `"wheel"` , and `"other"` .
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								  `"setuptools"`  is for when the source has a `setup.py`  and `setuptools`  is
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								  used to build a wheel, `flit` , in case `flit`  should be used to build a wheel,
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								  and `wheel`  in case a wheel is provided. Use `other`  when a custom
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								  `buildPhase`  and/or `installPhase`  is needed.
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								*  `makeWrapperArgs ? []` : A list of strings. Arguments to be passed to
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								  `makeWrapper` , which wraps generated binaries. By default, the arguments to
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								  `makeWrapper`  set `PATH`  and `PYTHONPATH`  environment variables before calling
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								  the binary. Additional arguments here can allow a developer to set environment
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								  variables which will be available when the binary is run. For example,
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								  `makeWrapperArgs = ["--set FOO BAR" "--set BAZ QUX"]` .
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								*  `namePrefix` : Prepends text to `${name}`  parameter. In case of libraries, this
							 
						 
					
						
							
								
									
										
										
										
											2020-05-09 12:58:00 -04:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								  defaults to `"python3.8-"`  for Python 3.8, etc., and in case of applications
							 
						 
					
						
							
								
									
										
										
										
											2020-02-09 11:23:11 -05:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								  to `""` .
							 
						 
					
						
							
								
									
										
										
										
											2020-06-06 12:46:00 +02:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								*  `pipInstallFlags ? []` : A list of strings. Arguments to be passed to `pip
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								  install`. To pass options to ` python setup.py install`, use
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								  `--install-option` . E.g., `pipInstallFlags=["--install-option='--cpp_implementation'"]` .
							 
						 
					
						
							
								
									
										
										
										
											2020-02-09 11:23:11 -05:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								*  `pythonPath ? []` : List of packages to be added into `$PYTHONPATH` . Packages
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								  in `pythonPath`  are not propagated (contrary to `propagatedBuildInputs` ).
							 
						 
					
						
							
								
									
										
										
										
											2016-02-21 20:13:44 +01:00 
										
									 
								 
							 
							
								
							 
							
								 
							 
							
							
								*  `preShellHook` : Hook to execute commands before `shellHook` .
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								*  `postShellHook` : Hook to execute commands after `shellHook` .
							 
						 
					
						
							
								
									
										
										
										
											2020-02-09 11:23:11 -05:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								*  `removeBinByteCode ? true` : Remove bytecode from `/bin` . Bytecode is only
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								  created when the filenames end with `.py` .
							 
						 
					
						
							
								
									
										
										
										
											2019-07-13 13:26:39 +02:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								*  `setupPyGlobalFlags ? []` : List of flags passed to `setup.py`  command.
							 
						 
					
						
							
								
									
										
										
										
											2018-05-30 19:07:02 +02:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								*  `setupPyBuildFlags ? []` : List of flags passed to `setup.py build_ext`  command.
							 
						 
					
						
							
								
									
										
										
										
											2016-02-21 20:13:44 +01:00 
										
									 
								 
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2020-02-09 11:23:11 -05:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								The `stdenv.mkDerivation`  function accepts various parameters for describing
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								build inputs (see "Specifying dependencies"). The following are of special
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								interest for Python packages, either because these are primarily used, or
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								because their behaviour is different:
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								*  `nativeBuildInputs ? []` : Build-time only dependencies. Typically executables
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								  as well as the items listed in `setup_requires` .
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								*  `buildInputs ? []` : Build and/or run-time dependencies that need to be be
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								  compiled for the host machine. Typically non-Python libraries which are being
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								  linked.
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								*  `checkInputs ? []` : Dependencies needed for running the `checkPhase` . These
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								  are added to `nativeBuildInputs`  when `doCheck = true` . Items listed in
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								  `tests_require`  go here.
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								*  `propagatedBuildInputs ? []` : Aside from propagating dependencies,
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								  `buildPythonPackage`  also injects code into and wraps executables with the
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								  paths included in this list. Items listed in `install_requires`  go here.
							 
						 
					
						
							
								
									
										
										
										
											2019-01-05 10:26:57 +01:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-03-21 10:08:10 +01:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								##### Overriding Python packages
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2020-02-09 11:23:11 -05:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								The `buildPythonPackage`  function has a `overridePythonAttrs`  method that can be
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								used to override the package. In the following example we create an environment
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								where we have the `blaze`  package using an older version of `pandas` . We
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								override first the Python interpreter and pass `packageOverrides`  which contains
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								the overrides for packages in the package set.
							 
						 
					
						
							
								
									
										
										
										
											2017-03-21 10:08:10 +01:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								```nix
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								with import < nixpkgs >  {};
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								(let
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								  python = let
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    packageOverrides = self: super: {
							 
						 
					
						
							
								
									
										
										
										
											2017-08-12 08:58:06 +02:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								      pandas = super.pandas.overridePythonAttrs(old: rec {
							 
						 
					
						
							
								
									
										
										
										
											2017-03-21 10:08:10 +01:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								        version = "0.19.1";
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								        src =  super.fetchPypi {
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								          pname = "pandas";
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								          inherit version;
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								          sha256 = "08blshqj9zj1wyjhhw3kl2vas75vhhicvv72flvf1z3jvapgw295";
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								        };
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								      });
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    };
							 
						 
					
						
							
								
									
										
										
										
											2019-07-05 13:55:45 +02:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								  in pkgs.python3.override {inherit packageOverrides; self = python;};
							 
						 
					
						
							
								
									
										
										
										
											2017-03-21 10:08:10 +01:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								in python.withPackages(ps: [ps.blaze])).env
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								```
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2016-02-21 20:13:44 +01:00 
										
									 
								 
							 
							
								
							 
							
								 
							 
							
							
								#### `buildPythonApplication` function
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2018-08-26 09:31:39 +02:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								The `buildPythonApplication`  function is practically the same as
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								`buildPythonPackage` . The main purpose of this function is to build a Python
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								package where one is interested only in the executables, and not importable
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								modules. For that reason, when adding this package to a `python.buildEnv` , the
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								modules won't be made available.
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								Another difference is that `buildPythonPackage`  by default prefixes the names of
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								the packages with the version of the interpreter. Because this is irrelevant for
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								applications, the prefix is omitted.
							 
						 
					
						
							
								
									
										
										
										
											2016-02-21 20:13:44 +01:00 
										
									 
								 
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
											 
										 
										
											
												doc: Rewrite python onboarding tutorials in manual
Based on some feedback in #87094 and discussion with @fridh, this re-organizes
the onboarding tutorial in the Nixpkgs manual's python section, so that we start
with the simplest, most ad-hoc examples and work our way up. This progresses
from:
1. How to create an temporary python env at the cmdline, then
2. How to create a specific python env for a single script, then
3. How to create a specific python env for a project in a shell.nix, then
4. How to install a specific python env globally on the system or in a user profile.
Additionally, I've tried to standardize on some of the "best practice" ways of
doing things:
1. Instead of saying that this command style is "supported but strongly not
   discouraged", I've just deleted it to avoid confusion.
   Bad:  nix-shell -p python38Packages.numpy python38Packages.toolz
   Good: nix-shell -p 'python38.withPackages(ps: with ps; [ numpy toolz ])'
2. In the portion where we show how to add stuff to the user's
   `XDG_CONFIG_HOME`, use overlays instead of `config.nix`. The former can do
   everything the latter can do, but is also much more generic and powerful,
   because it can compose with other files, compose with other envs, compose
   with overlays that do things like swap whether tensorflow and pytorch are
   built openblas/mkl/cuda stacks, and so on. The user is eventually going to
   see the overlay, so to avoid confusion let's standardize on it.
											 
										 
										
											2020-05-09 19:11:09 -04:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								When packaging a Python application with `buildPythonApplication` , it should be
							 
						 
					
						
							
								
									
										
										
										
											2018-10-11 20:18:33 +00:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								called with `callPackage`  and passed `python`  or `pythonPackages`  (possibly
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								specifying an interpreter version), like this:
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								```nix
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								{ lib, python3Packages }:
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								python3Packages.buildPythonApplication rec {
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								  pname = "luigi";
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								  version = "2.7.9";
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								  src = python3Packages.fetchPypi {
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    inherit pname version;
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    sha256 = "035w8gqql36zlan0xjrzz9j4lh9hs0qrsgnbyw07qs7lnkvbdv9x";
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								  };
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2018-10-04 21:51:46 -04:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								  propagatedBuildInputs = with python3Packages; [ tornado_4 python-daemon ];
							 
						 
					
						
							
								
									
										
										
										
											2018-10-11 20:18:33 +00:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								  meta = with lib; {
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    ...
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								  };
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								}
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								```
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								This is then added to `all-packages.nix`  just as any other application would be.
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								```nix
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								luigi = callPackage ../applications/networking/cluster/luigi { };
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								```
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								Since the package is an application, a consumer doesn't need to care about
							 
						 
					
						
							
								
									
										
											 
										 
										
											
												doc: Rewrite python onboarding tutorials in manual
Based on some feedback in #87094 and discussion with @fridh, this re-organizes
the onboarding tutorial in the Nixpkgs manual's python section, so that we start
with the simplest, most ad-hoc examples and work our way up. This progresses
from:
1. How to create an temporary python env at the cmdline, then
2. How to create a specific python env for a single script, then
3. How to create a specific python env for a project in a shell.nix, then
4. How to install a specific python env globally on the system or in a user profile.
Additionally, I've tried to standardize on some of the "best practice" ways of
doing things:
1. Instead of saying that this command style is "supported but strongly not
   discouraged", I've just deleted it to avoid confusion.
   Bad:  nix-shell -p python38Packages.numpy python38Packages.toolz
   Good: nix-shell -p 'python38.withPackages(ps: with ps; [ numpy toolz ])'
2. In the portion where we show how to add stuff to the user's
   `XDG_CONFIG_HOME`, use overlays instead of `config.nix`. The former can do
   everything the latter can do, but is also much more generic and powerful,
   because it can compose with other files, compose with other envs, compose
   with overlays that do things like swap whether tensorflow and pytorch are
   built openblas/mkl/cuda stacks, and so on. The user is eventually going to
   see the overlay, so to avoid confusion let's standardize on it.
											 
										 
										
											2020-05-09 19:11:09 -04:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								Python versions or modules, which is why they don't go in `pythonPackages` .
							 
						 
					
						
							
								
									
										
										
										
											2018-10-09 20:42:29 -04:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2018-05-30 19:07:02 +02:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								#### `toPythonApplication` function
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								A distinction is made between applications and libraries, however, sometimes a
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								package is used as both. In this case the package is added as a library to
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								`python-packages.nix`  and as an application to `all-packages.nix` . To reduce
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								duplication the `toPythonApplication`  can be used to convert a library to an
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								application.
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								The Nix expression shall use `buildPythonPackage`  and be called from
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								`python-packages.nix` . A reference shall be created from `all-packages.nix`  to
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								the attribute in `python-packages.nix` , and the `toPythonApplication`  shall be
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								applied to the reference:
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								```nix
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								youtube-dl = with pythonPackages; toPythonApplication youtube-dl;
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								```
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								#### `toPythonModule` function
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								In some cases, such as bindings, a package is created using
							 
						 
					
						
							
								
									
										
										
										
											2020-02-09 11:23:11 -05:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								`stdenv.mkDerivation`  and added as attribute in `all-packages.nix` . The Python
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								bindings should be made available from `python-packages.nix` . The
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								`toPythonModule`  function takes a derivation and makes certain Python-specific
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								modifications.
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2018-05-30 19:07:02 +02:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								```nix
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								opencv = toPythonModule (pkgs.opencv.override {
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								  enablePython = true;
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								  pythonPackages = self;
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								});
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								```
							 
						 
					
						
							
								
									
										
										
										
											2020-02-09 11:23:11 -05:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2018-05-30 19:07:02 +02:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								Do pay attention to passing in the right Python version!
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								#### `python.buildEnv` function
 
							 
						 
					
						
							
								
									
										
										
										
											2016-02-21 20:13:44 +01:00 
										
									 
								 
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								Python environments can be created using the low-level `pkgs.buildEnv`  function.
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								This example shows how to create an environment that has the Pyramid Web Framework.
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								Saving the following as `default.nix` 
							 
						 
					
						
							
								
									
										
										
										
											2020-02-09 11:23:11 -05:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-03-05 17:16:29 +01:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								```nix
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								with import < nixpkgs >  {};
							 
						 
					
						
							
								
									
										
										
										
											2016-02-21 20:13:44 +01:00 
										
									 
								 
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-03-05 17:16:29 +01:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								python.buildEnv.override {
							 
						 
					
						
							
								
									
										
										
										
											2019-03-22 22:50:30 -04:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								  extraLibs = [ pythonPackages.pyramid ];
							 
						 
					
						
							
								
									
										
										
										
											2017-03-05 17:16:29 +01:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								  ignoreCollisions = true;
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								}
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								```
							 
						 
					
						
							
								
									
										
										
										
											2016-02-21 20:13:44 +01:00 
										
									 
								 
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								and running `nix-build`  will create
							 
						 
					
						
							
								
									
										
										
										
											2020-02-09 11:23:11 -05:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-03-05 17:16:29 +01:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								```
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								/nix/store/cf1xhjwzmdki7fasgr4kz6di72ykicl5-python-2.7.8-env
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								```
							 
						 
					
						
							
								
									
										
										
										
											2016-02-21 20:13:44 +01:00 
										
									 
								 
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								with wrapped binaries in `bin/` .
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								You can also use the `env`  attribute to create local environments with needed
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								packages installed. This is somewhat comparable to `virtualenv` . For example,
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								running `nix-shell`  with the following `shell.nix` 
							 
						 
					
						
							
								
									
										
										
										
											2020-02-09 11:23:11 -05:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-03-05 17:16:29 +01:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								```nix
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								with import < nixpkgs >  {};
							 
						 
					
						
							
								
									
										
										
										
											2016-02-21 20:13:44 +01:00 
										
									 
								 
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-03-05 17:16:29 +01:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								(python3.buildEnv.override {
							 
						 
					
						
							
								
									
										
										
										
											2017-05-07 12:55:45 +02:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								  extraLibs = with python3Packages; [ numpy requests ];
							 
						 
					
						
							
								
									
										
										
										
											2017-03-05 17:16:29 +01:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								}).env
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								```
							 
						 
					
						
							
								
									
										
										
										
											2016-02-21 20:13:44 +01:00 
										
									 
								 
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								will drop you into a shell where Python will have the
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								specified packages in its path.
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								##### `python.buildEnv` arguments
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								*  `extraLibs` : List of packages installed inside the environment.
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								*  `postBuild` : Shell command executed after the build of environment.
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								*  `ignoreCollisions` : Ignore file collisions inside the environment (default is `false` ).
							 
						 
					
						
							
								
									
										
										
										
											2020-02-09 11:23:11 -05:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								*  `permitUserSite` : Skip setting the `PYTHONNOUSERSITE`  environment variable in
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								  wrapped binaries in the environment.
							 
						 
					
						
							
								
									
										
										
										
											2016-02-21 20:13:44 +01:00 
										
									 
								 
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2018-05-30 19:07:02 +02:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								#### `python.withPackages` function
 
							 
						 
					
						
							
								
									
										
										
										
											2016-05-29 16:08:27 +02:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								The `python.withPackages`  function provides a simpler interface to the `python.buildEnv`  functionality.
							 
						 
					
						
							
								
									
										
										
										
											2017-03-05 01:00:02 +01:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								It takes a function as an argument that is passed the set of python packages and returns the list
							 
						 
					
						
							
								
									
										
										
										
											2016-05-29 16:08:27 +02:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								of the packages to be included in the environment. Using the `withPackages`  function, the previous
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								example for the Pyramid Web Framework environment can be written like this:
							 
						 
					
						
							
								
									
										
										
										
											2020-02-09 11:23:11 -05:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-03-05 17:16:29 +01:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								```nix
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								with import < nixpkgs >  {};
							 
						 
					
						
							
								
									
										
										
										
											2016-05-29 16:08:27 +02:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-03-05 17:16:29 +01:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								python.withPackages (ps: [ps.pyramid])
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								```
							 
						 
					
						
							
								
									
										
										
										
											2016-05-29 16:08:27 +02:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2020-02-09 11:23:11 -05:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								`withPackages`  passes the correct package set for the specific interpreter
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								version as an argument to the function. In the above example, `ps`  equals
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								`pythonPackages` . But you can also easily switch to using python3:
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-03-05 17:16:29 +01:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								```nix
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								with import < nixpkgs >  {};
							 
						 
					
						
							
								
									
										
										
										
											2017-03-05 01:00:02 +01:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-03-05 17:16:29 +01:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								python3.withPackages (ps: [ps.pyramid])
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								```
							 
						 
					
						
							
								
									
										
										
										
											2016-05-29 16:08:27 +02:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								Now, `ps`  is set to `python3Packages` , matching the version of the interpreter.
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2020-02-09 11:23:11 -05:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								As `python.withPackages`  simply uses `python.buildEnv`  under the hood, it also
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								supports the `env`  attribute. The `shell.nix`  file from the previous section can
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								thus be also written like this:
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-03-05 17:16:29 +01:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								```nix
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								with import < nixpkgs >  {};
							 
						 
					
						
							
								
									
										
										
										
											2016-05-29 16:08:27 +02:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
											 
										 
										
											
												doc: Rewrite python onboarding tutorials in manual
Based on some feedback in #87094 and discussion with @fridh, this re-organizes
the onboarding tutorial in the Nixpkgs manual's python section, so that we start
with the simplest, most ad-hoc examples and work our way up. This progresses
from:
1. How to create an temporary python env at the cmdline, then
2. How to create a specific python env for a single script, then
3. How to create a specific python env for a project in a shell.nix, then
4. How to install a specific python env globally on the system or in a user profile.
Additionally, I've tried to standardize on some of the "best practice" ways of
doing things:
1. Instead of saying that this command style is "supported but strongly not
   discouraged", I've just deleted it to avoid confusion.
   Bad:  nix-shell -p python38Packages.numpy python38Packages.toolz
   Good: nix-shell -p 'python38.withPackages(ps: with ps; [ numpy toolz ])'
2. In the portion where we show how to add stuff to the user's
   `XDG_CONFIG_HOME`, use overlays instead of `config.nix`. The former can do
   everything the latter can do, but is also much more generic and powerful,
   because it can compose with other files, compose with other envs, compose
   with overlays that do things like swap whether tensorflow and pytorch are
   built openblas/mkl/cuda stacks, and so on. The user is eventually going to
   see the overlay, so to avoid confusion let's standardize on it.
											 
										 
										
											2020-05-09 19:11:09 -04:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								(python38.withPackages (ps: [ps.numpy ps.requests])).env
							 
						 
					
						
							
								
									
										
										
										
											2017-03-05 17:16:29 +01:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								```
							 
						 
					
						
							
								
									
										
										
										
											2016-05-29 16:08:27 +02:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2020-02-09 11:23:11 -05:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								In contrast to `python.buildEnv` , `python.withPackages`  does not support the
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								more advanced options such as `ignoreCollisions = true`  or `postBuild` . If you
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								need them, you have to use `python.buildEnv` .
							 
						 
					
						
							
								
									
										
										
										
											2016-05-29 16:08:27 +02:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2020-02-09 11:23:11 -05:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								Python 2 namespace packages may provide `__init__.py`  that collide. In that case
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								`python.buildEnv`  should be used with `ignoreCollisions = true` .
							 
						 
					
						
							
								
									
										
										
										
											2017-04-18 09:05:00 +02:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2019-07-17 20:36:47 +02:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								#### Setup hooks
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2020-02-09 11:23:11 -05:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								The following are setup hooks specifically for Python packages. Most of these
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								are used in `buildPythonPackage` .
							 
						 
					
						
							
								
									
										
										
										
											2019-07-17 20:36:47 +02:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2020-02-09 11:23:11 -05:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								-  `eggUnpackhook`  to move an egg to the correct folder so it can be installed
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								  with the `eggInstallHook` 
							 
						 
					
						
							
								
									
										
										
										
											2020-01-08 13:29:03 +00:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								-  `eggBuildHook`  to skip building for eggs.
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								-  `eggInstallHook`  to install eggs.
							 
						 
					
						
							
								
									
										
										
										
											2019-07-17 20:36:47 +02:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								-  `flitBuildHook`  to build a wheel using `flit` .
							 
						 
					
						
							
								
									
										
										
										
											2020-02-09 11:23:11 -05:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								-  `pipBuildHook`  to build a wheel using `pip`  and PEP 517. Note a build system
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								  (e.g. `setuptools`  or `flit` ) should still be added as `nativeBuildInput` .
							 
						 
					
						
							
								
									
										
										
										
											2019-07-17 20:36:47 +02:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								-  `pipInstallHook`  to install wheels.
							 
						 
					
						
							
								
									
										
										
										
											2020-08-17 10:23:45 -07:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								-  `pytestCheckHook`  to run tests with `pytest` . See [example usage ](#using-pytestcheckhook ).
							 
						 
					
						
							
								
									
										
										
										
											2019-07-17 20:36:47 +02:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								-  `pythonCatchConflictsHook`  to check whether a Python package is not already existing.
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								-  `pythonImportsCheckHook`  to check whether importing the listed modules works.
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								-  `pythonRemoveBinBytecode`  to remove bytecode from the `/bin`  folder.
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								-  `setuptoolsBuildHook`  to build a wheel using `setuptools` .
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								-  `setuptoolsCheckHook`  to run tests with `python setup.py test` .
							 
						 
					
						
							
								
									
										
										
										
											2020-02-09 11:23:11 -05:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								-  `venvShellHook`  to source a Python 3 `venv`  at the `venvDir`  location. A
							 
						 
					
						
							
								
									
										
										
										
											2020-05-16 00:34:11 -07:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								  `venv`  is created if it does not yet exist. `postVenvCreation`  can be used to
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								  to run commands only after venv is first created.
							 
						 
					
						
							
								
									
										
										
										
											2020-02-09 11:23:11 -05:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								-  `wheelUnpackHook`  to move a wheel to the correct folder so it can be installed
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								  with the `pipInstallHook` .
							 
						 
					
						
							
								
									
										
										
										
											2019-07-17 20:36:47 +02:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2016-02-21 20:13:44 +01:00 
										
									 
								 
							 
							
								
							 
							
								 
							 
							
							
								### Development mode
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								Development or editable mode is supported. To develop Python packages
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								`buildPythonPackage`  has additional logic inside `shellPhase`  to run `pip
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								install -e . --prefix $TMPDIR/`for the package.
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								Warning: `shellPhase`  is executed only if `setup.py`  exists.
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								Given a `default.nix` :
							 
						 
					
						
							
								
									
										
										
										
											2017-03-05 17:16:29 +01:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								```nix
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								with import < nixpkgs >  {};
							 
						 
					
						
							
								
									
										
										
										
											2016-02-21 20:13:44 +01:00 
										
									 
								 
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2019-03-22 22:50:30 -04:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								pythonPackages.buildPythonPackage {
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								  name = "myproject";
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								  buildInputs = with pythonPackages; [ pyramid ];
							 
						 
					
						
							
								
									
										
										
										
											2016-02-21 20:13:44 +01:00 
										
									 
								 
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2019-03-22 22:50:30 -04:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								  src = ./.;
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								}
							 
						 
					
						
							
								
									
										
										
										
											2017-03-05 17:16:29 +01:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								```
							 
						 
					
						
							
								
									
										
										
										
											2016-02-21 20:13:44 +01:00 
										
									 
								 
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2020-02-09 11:23:11 -05:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								Running `nix-shell`  with no arguments should give you the environment in which
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								the package would be built with `nix-build` .
							 
						 
					
						
							
								
									
										
										
										
											2016-02-21 20:13:44 +01:00 
										
									 
								 
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
											 
										 
										
											
												doc: Rewrite python onboarding tutorials in manual
Based on some feedback in #87094 and discussion with @fridh, this re-organizes
the onboarding tutorial in the Nixpkgs manual's python section, so that we start
with the simplest, most ad-hoc examples and work our way up. This progresses
from:
1. How to create an temporary python env at the cmdline, then
2. How to create a specific python env for a single script, then
3. How to create a specific python env for a project in a shell.nix, then
4. How to install a specific python env globally on the system or in a user profile.
Additionally, I've tried to standardize on some of the "best practice" ways of
doing things:
1. Instead of saying that this command style is "supported but strongly not
   discouraged", I've just deleted it to avoid confusion.
   Bad:  nix-shell -p python38Packages.numpy python38Packages.toolz
   Good: nix-shell -p 'python38.withPackages(ps: with ps; [ numpy toolz ])'
2. In the portion where we show how to add stuff to the user's
   `XDG_CONFIG_HOME`, use overlays instead of `config.nix`. The former can do
   everything the latter can do, but is also much more generic and powerful,
   because it can compose with other files, compose with other envs, compose
   with overlays that do things like swap whether tensorflow and pytorch are
   built openblas/mkl/cuda stacks, and so on. The user is eventually going to
   see the overlay, so to avoid confusion let's standardize on it.
											 
										 
										
											2020-05-09 19:11:09 -04:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								Shortcut to setup environments with C headers/libraries and Python packages:
							 
						 
					
						
							
								
									
										
										
										
											2020-02-09 11:23:11 -05:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-03-05 17:16:29 +01:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								```shell
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								nix-shell -p pythonPackages.pyramid zlib libjpeg git
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								```
							 
						 
					
						
							
								
									
										
										
										
											2016-02-21 20:13:44 +01:00 
										
									 
								 
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								Note: There is a boolean value `lib.inNixShell`  set to `true`  if nix-shell is invoked.
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								### Tools
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								Packages inside nixpkgs are written by hand. However many tools exist in
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								community to help save time. No tool is preferred at the moment.
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2020-02-09 11:23:11 -05:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								-  [pypi2nix ](https://github.com/nix-community/pypi2nix ): Generate Nix
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								  expressions for your Python project. Note that [sharing derivations from
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								  pypi2nix with nixpkgs is possible but not
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								  encouraged](https://github.com/nix-community/pypi2nix/issues/222#issuecomment -443497376).
							 
						 
					
						
							
								
									
										
										
										
											2019-10-14 01:54:01 -07:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								-  [python2nix ](https://github.com/proger/python2nix ) by Vladimir Kirillov.
							 
						 
					
						
							
								
									
										
										
										
											2016-02-21 20:13:44 +01:00 
										
									 
								 
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-02-22 15:55:58 +01:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								### Deterministic builds
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2020-02-09 11:23:11 -05:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								The Python interpreters are now built deterministically. Minor modifications had
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								to be made to the interpreters in order to generate deterministic bytecode. This
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								has security implications and is relevant for those using Python in a
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								`nix-shell` .
							 
						 
					
						
							
								
									
										
										
										
											2017-02-22 15:55:58 +01:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2020-02-09 11:23:11 -05:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								When the environment variable `DETERMINISTIC_BUILD`  is set, all bytecode will
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								have timestamp 1. The `buildPythonPackage`  function sets `DETERMINISTIC_BUILD=1` 
							 
						 
					
						
							
								
									
										
										
										
											2020-05-09 12:58:00 -04:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								and [PYTHONHASHSEED=0 ](https://docs.python.org/3.8/using/cmdline.html#envvar-PYTHONHASHSEED ).
							 
						 
					
						
							
								
									
										
										
										
											2017-02-22 15:55:58 +01:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								Both are also exported in `nix-shell` .
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-09-02 12:06:37 +02:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								### Automatic tests
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								It is recommended to test packages as part of the build process.
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								Source distributions (`sdist` ) often include test files, but not always.
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								By default the command `python setup.py test`  is run as part of the
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								`checkPhase` , but often it is necessary to pass a custom `checkPhase` . An
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								example of such a situation is when `py.test`  is used.
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								#### Common issues
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2020-02-09 11:23:11 -05:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								*  Non-working tests can often be deselected. By default `buildPythonPackage` 
							 
						 
					
						
							
								
									
										
											 
										 
										
											
												doc: Rewrite python onboarding tutorials in manual
Based on some feedback in #87094 and discussion with @fridh, this re-organizes
the onboarding tutorial in the Nixpkgs manual's python section, so that we start
with the simplest, most ad-hoc examples and work our way up. This progresses
from:
1. How to create an temporary python env at the cmdline, then
2. How to create a specific python env for a single script, then
3. How to create a specific python env for a project in a shell.nix, then
4. How to install a specific python env globally on the system or in a user profile.
Additionally, I've tried to standardize on some of the "best practice" ways of
doing things:
1. Instead of saying that this command style is "supported but strongly not
   discouraged", I've just deleted it to avoid confusion.
   Bad:  nix-shell -p python38Packages.numpy python38Packages.toolz
   Good: nix-shell -p 'python38.withPackages(ps: with ps; [ numpy toolz ])'
2. In the portion where we show how to add stuff to the user's
   `XDG_CONFIG_HOME`, use overlays instead of `config.nix`. The former can do
   everything the latter can do, but is also much more generic and powerful,
   because it can compose with other files, compose with other envs, compose
   with overlays that do things like swap whether tensorflow and pytorch are
   built openblas/mkl/cuda stacks, and so on. The user is eventually going to
   see the overlay, so to avoid confusion let's standardize on it.
											 
										 
										
											2020-05-09 19:11:09 -04:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								  runs `python setup.py test` . Most Python modules follows the standard test
							 
						 
					
						
							
								
									
										
										
										
											2020-02-09 11:23:11 -05:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								  protocol where the pytest runner can be used instead. `py.test`  supports a
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								  `-k`  parameter to ignore test methods or classes:
							 
						 
					
						
							
								
									
										
										
										
											2018-05-30 19:07:02 +02:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-09-25 14:00:47 +01:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								  ```nix
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								  buildPythonPackage {
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    # ...
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    # assumes the tests are located in tests
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    checkInputs = [ pytest ];
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    checkPhase = ''
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								      py.test -k 'not function_name and not other_function' tests
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    '';
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								  }
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								  ```
							 
						 
					
						
							
								
									
										
										
										
											2020-02-09 11:23:11 -05:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								*  Tests that attempt to access `$HOME`  can be fixed by using the following
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								  work-around before running tests (e.g. `preCheck` ): `export HOME=$(mktemp -d)` 
							 
						 
					
						
							
								
									
										
										
										
											2017-09-02 12:06:37 +02:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2016-02-21 20:13:44 +01:00 
										
									 
								 
							 
							
								
							 
							
								 
							 
							
							
								## FAQ
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								### How to solve circular dependencies?
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								Consider the packages `A`  and `B`  that depend on each other. When packaging `B` ,
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								a solution is to override package `A`  not to depend on `B`  as an input. The same
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								should also be done when packaging `A` .
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								### How to override a Python package?
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2020-02-09 11:23:11 -05:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								We can override the interpreter and pass `packageOverrides` . In the following
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								example we rename the `pandas`  package and build it.
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2016-12-04 11:55:25 +01:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								```nix
							 
						 
					
						
							
								
									
										
										
										
											2016-02-21 20:13:44 +01:00 
										
									 
								 
							 
							
								
							 
							
								 
							 
							
							
								with import < nixpkgs >  {};
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-03-21 10:08:10 +01:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								(let
							 
						 
					
						
							
								
									
										
										
										
											2016-12-04 11:55:25 +01:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								  python = let
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    packageOverrides = self: super: {
							 
						 
					
						
							
								
									
										
										
										
											2017-08-12 08:58:06 +02:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								      pandas = super.pandas.overridePythonAttrs(old: {name="foo";});
							 
						 
					
						
							
								
									
										
										
										
											2016-12-04 11:55:25 +01:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								    };
							 
						 
					
						
							
								
									
										
										
										
											2020-05-09 12:58:00 -04:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								  in pkgs.python38.override {inherit packageOverrides;};
							 
						 
					
						
							
								
									
										
										
										
											2016-02-21 20:13:44 +01:00 
										
									 
								 
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-03-21 10:08:10 +01:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								in python.withPackages(ps: [ps.pandas])).env
							 
						 
					
						
							
								
									
										
										
										
											2016-02-21 20:13:44 +01:00 
										
									 
								 
							 
							
								
							 
							
								 
							 
							
							
								```
							 
						 
					
						
							
								
									
										
										
										
											2020-02-09 11:23:11 -05:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-03-21 10:08:10 +01:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								Using `nix-build`  on this expression will build an environment that contains the
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								package `pandas`  but with the new name `foo` .
							 
						 
					
						
							
								
									
										
										
										
											2016-02-21 20:13:44 +01:00 
										
									 
								 
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2020-02-09 11:23:11 -05:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								All packages in the package set will use the renamed package. A typical use case
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								is to switch to another version of a certain package. For example, in the
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								Nixpkgs repository we have multiple versions of `django`  and `scipy` . In the
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								following example we use a different version of `scipy`  and create an
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								environment that uses it. All packages in the Python package set will now use
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								the updated `scipy`  version.
							 
						 
					
						
							
								
									
										
										
										
											2016-02-21 20:13:44 +01:00 
										
									 
								 
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2016-12-04 11:55:25 +01:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								```nix
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								with import < nixpkgs >  {};
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-03-05 17:16:29 +01:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								( let
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    packageOverrides = self: super: {
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								      scipy = super.scipy_0_17;
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    };
							 
						 
					
						
							
								
									
										
										
										
											2020-05-09 12:58:00 -04:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								  in (pkgs.python38.override {inherit packageOverrides;}).withPackages (ps: [ps.blaze])
							 
						 
					
						
							
								
									
										
										
										
											2016-05-29 16:30:29 +02:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								).env
							 
						 
					
						
							
								
									
										
										
										
											2016-02-21 20:13:44 +01:00 
										
									 
								 
							 
							
								
							 
							
								 
							 
							
							
								```
							 
						 
					
						
							
								
									
										
										
										
											2020-02-09 11:23:11 -05:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2016-12-04 11:55:25 +01:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								The requested package `blaze`  depends on `pandas`  which itself depends on `scipy` .
							 
						 
					
						
							
								
									
										
										
										
											2016-02-21 20:13:44 +01:00 
										
									 
								 
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2020-02-09 11:23:11 -05:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								If you want the whole of Nixpkgs to use your modifications, then you can use
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								`overlays`  as explained in this manual. In the following example we build a
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								`inkscape`  using a different version of `numpy` .
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-03-05 17:16:29 +01:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								```nix
							 
						 
					
						
							
								
									
										
										
										
											2016-12-04 11:55:25 +01:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								let
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								  pkgs = import < nixpkgs >  {};
							 
						 
					
						
							
								
									
										
										
										
											2020-05-09 18:02:20 -04:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								  newpkgs = import pkgs.path { overlays = [ (self: super: {
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    python38 = let
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								      packageOverrides = python-self: python-super: {
							 
						 
					
						
							
								
									
										
											 
										 
										
											
												doc: Rewrite python onboarding tutorials in manual
Based on some feedback in #87094 and discussion with @fridh, this re-organizes
the onboarding tutorial in the Nixpkgs manual's python section, so that we start
with the simplest, most ad-hoc examples and work our way up. This progresses
from:
1. How to create an temporary python env at the cmdline, then
2. How to create a specific python env for a single script, then
3. How to create a specific python env for a project in a shell.nix, then
4. How to install a specific python env globally on the system or in a user profile.
Additionally, I've tried to standardize on some of the "best practice" ways of
doing things:
1. Instead of saying that this command style is "supported but strongly not
   discouraged", I've just deleted it to avoid confusion.
   Bad:  nix-shell -p python38Packages.numpy python38Packages.toolz
   Good: nix-shell -p 'python38.withPackages(ps: with ps; [ numpy toolz ])'
2. In the portion where we show how to add stuff to the user's
   `XDG_CONFIG_HOME`, use overlays instead of `config.nix`. The former can do
   everything the latter can do, but is also much more generic and powerful,
   because it can compose with other files, compose with other envs, compose
   with overlays that do things like swap whether tensorflow and pytorch are
   built openblas/mkl/cuda stacks, and so on. The user is eventually going to
   see the overlay, so to avoid confusion let's standardize on it.
											 
										 
										
											2020-05-09 19:11:09 -04:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								        numpy = python-super.numpy_1_18;
							 
						 
					
						
							
								
									
										
										
										
											2016-12-04 11:55:25 +01:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								      };
							 
						 
					
						
							
								
									
										
										
										
											2020-05-09 18:02:20 -04:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								    in super.python38.override {inherit packageOverrides;};
							 
						 
					
						
							
								
									
										
										
										
											2016-12-17 18:05:21 +00:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								  } ) ]; };
							 
						 
					
						
							
								
									
										
										
										
											2016-12-04 11:55:25 +01:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								in newpkgs.inkscape
							 
						 
					
						
							
								
									
										
										
										
											2016-08-30 17:06:17 +02:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								```
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2016-08-13 14:18:59 +02:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								### `python setup.py bdist_wheel` cannot create .whl
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2016-08-30 17:16:13 +02:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								Executing `python setup.py bdist_wheel`  in a `nix-shell ` fails with
							 
						 
					
						
							
								
									
										
										
										
											2016-08-13 14:18:59 +02:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								```
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								ValueError: ZIP does not support timestamps before 1980
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								```
							 
						 
					
						
							
								
									
										
										
										
											2018-03-21 19:57:52 +00:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2020-02-09 11:23:11 -05:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								This is because files from the Nix store (which have a timestamp of the UNIX
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								epoch of January 1, 1970) are included in the .ZIP, but .ZIP archives follow the
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								DOS convention of counting timestamps from 1980.
							 
						 
					
						
							
								
									
										
										
										
											2018-03-21 19:57:52 +00:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2020-02-09 11:23:11 -05:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								The command `bdist_wheel`  reads the `SOURCE_DATE_EPOCH`  environment variable,
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								which `nix-shell`  sets to 1. Unsetting this variable or giving it a value
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								corresponding to 1980 or later enables building wheels.
							 
						 
					
						
							
								
									
										
										
										
											2016-08-13 14:18:59 +02:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								Use 1980 as timestamp:
							 
						 
					
						
							
								
									
										
										
										
											2020-02-09 11:23:11 -05:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-03-05 17:16:29 +01:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								```shell
							 
						 
					
						
							
								
									
										
										
										
											2016-08-30 17:16:13 +02:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								nix-shell --run "SOURCE_DATE_EPOCH=315532800 python3 setup.py bdist_wheel"
							 
						 
					
						
							
								
									
										
										
										
											2016-08-13 14:18:59 +02:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								```
							 
						 
					
						
							
								
									
										
										
										
											2020-02-09 11:23:11 -05:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2016-08-13 14:18:59 +02:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								or the current time:
							 
						 
					
						
							
								
									
										
										
										
											2020-02-09 11:23:11 -05:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-03-05 17:16:29 +01:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								```shell
							 
						 
					
						
							
								
									
										
										
										
											2016-08-30 17:16:13 +02:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								nix-shell --run "SOURCE_DATE_EPOCH=$(date +%s) python3 setup.py bdist_wheel"
							 
						 
					
						
							
								
									
										
										
										
											2016-08-13 14:18:59 +02:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								```
							 
						 
					
						
							
								
									
										
										
										
											2020-02-09 11:23:11 -05:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2018-03-21 19:57:52 +00:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								or unset `SOURCE_DATE_EPOCH` :
							 
						 
					
						
							
								
									
										
										
										
											2020-02-09 11:23:11 -05:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-03-05 17:16:29 +01:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								```shell
							 
						 
					
						
							
								
									
										
										
										
											2016-08-30 17:16:13 +02:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								nix-shell --run "unset SOURCE_DATE_EPOCH; python3 setup.py bdist_wheel"
							 
						 
					
						
							
								
									
										
										
										
											2016-12-04 11:55:25 +01:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								```
							 
						 
					
						
							
								
									
										
										
										
											2016-02-21 20:13:44 +01:00 
										
									 
								 
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								### `install_data` / `data_files` problems
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								If you get the following error:
							 
						 
					
						
							
								
									
										
										
										
											2020-02-09 11:23:11 -05:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-03-05 17:16:29 +01:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								```
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								could not create '/nix/store/6l1bvljpy8gazlsw2aw9skwwp4pmvyxw-python-2.7.8/etc':
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								Permission denied
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								```
							 
						 
					
						
							
								
									
										
										
										
											2020-02-09 11:23:11 -05:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								This is a [known bug ](https://github.com/pypa/setuptools/issues/130 ) in
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								`setuptools` . Setuptools `install_data`  does not respect `--prefix` . An example
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								of such package using the feature is `pkgs/tools/X11/xpra/default.nix` .
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2016-02-21 20:13:44 +01:00 
										
									 
								 
							 
							
								
							 
							
								 
							 
							
							
								As workaround install it as an extra `preInstall`  step:
							 
						 
					
						
							
								
									
										
										
										
											2020-02-09 11:23:11 -05:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-03-05 17:16:29 +01:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								```shell
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								${python.interpreter} setup.py install_data --install-dir=$out --root=$out
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								sed -i '/ = data\_files/d' setup.py
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								```
							 
						 
					
						
							
								
									
										
										
										
											2016-02-21 20:13:44 +01:00 
										
									 
								 
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								###  Rationale of non-existent global site-packages
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								On most operating systems a global `site-packages`  is maintained. This however
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								becomes problematic if you want to run multiple Python versions or have multiple
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								versions of certain libraries for your projects. Generally, you would solve such
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								issues by creating virtual environments using `virtualenv` .
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								On Nix each package has an isolated dependency tree which, in the case of
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								Python, guarantees the right versions of the interpreter and libraries or
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								packages are available. There is therefore no need to maintain a global `site-packages` .
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								If you want to create a Python environment for development, then the recommended
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								method is to use `nix-shell` , either with or without the `python.buildEnv` 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								function.
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
											 
										 
										
											
												doc: Rewrite python onboarding tutorials in manual
Based on some feedback in #87094 and discussion with @fridh, this re-organizes
the onboarding tutorial in the Nixpkgs manual's python section, so that we start
with the simplest, most ad-hoc examples and work our way up. This progresses
from:
1. How to create an temporary python env at the cmdline, then
2. How to create a specific python env for a single script, then
3. How to create a specific python env for a project in a shell.nix, then
4. How to install a specific python env globally on the system or in a user profile.
Additionally, I've tried to standardize on some of the "best practice" ways of
doing things:
1. Instead of saying that this command style is "supported but strongly not
   discouraged", I've just deleted it to avoid confusion.
   Bad:  nix-shell -p python38Packages.numpy python38Packages.toolz
   Good: nix-shell -p 'python38.withPackages(ps: with ps; [ numpy toolz ])'
2. In the portion where we show how to add stuff to the user's
   `XDG_CONFIG_HOME`, use overlays instead of `config.nix`. The former can do
   everything the latter can do, but is also much more generic and powerful,
   because it can compose with other files, compose with other envs, compose
   with overlays that do things like swap whether tensorflow and pytorch are
   built openblas/mkl/cuda stacks, and so on. The user is eventually going to
   see the overlay, so to avoid confusion let's standardize on it.
											 
										 
										
											2020-05-09 19:11:09 -04:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								### How to consume Python modules using pip in a virtual environment like I am used to on other Operating Systems?
 
							 
						 
					
						
							
								
									
										
										
										
											2017-01-12 16:00:50 +00:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2020-02-09 11:23:11 -05:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								While this approach is not very idiomatic from Nix perspective, it can still be
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								useful when dealing with pre-existing projects or in situations where it's not
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								feasible or desired to write derivations for all required dependencies.
							 
						 
					
						
							
								
									
										
										
										
											2020-01-12 18:27:17 +01:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2020-02-09 11:23:11 -05:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								This is an example of a `default.nix`  for a `nix-shell` , which allows to consume
							 
						 
					
						
							
								
									
										
											 
										 
										
											
												doc: Rewrite python onboarding tutorials in manual
Based on some feedback in #87094 and discussion with @fridh, this re-organizes
the onboarding tutorial in the Nixpkgs manual's python section, so that we start
with the simplest, most ad-hoc examples and work our way up. This progresses
from:
1. How to create an temporary python env at the cmdline, then
2. How to create a specific python env for a single script, then
3. How to create a specific python env for a project in a shell.nix, then
4. How to install a specific python env globally on the system or in a user profile.
Additionally, I've tried to standardize on some of the "best practice" ways of
doing things:
1. Instead of saying that this command style is "supported but strongly not
   discouraged", I've just deleted it to avoid confusion.
   Bad:  nix-shell -p python38Packages.numpy python38Packages.toolz
   Good: nix-shell -p 'python38.withPackages(ps: with ps; [ numpy toolz ])'
2. In the portion where we show how to add stuff to the user's
   `XDG_CONFIG_HOME`, use overlays instead of `config.nix`. The former can do
   everything the latter can do, but is also much more generic and powerful,
   because it can compose with other files, compose with other envs, compose
   with overlays that do things like swap whether tensorflow and pytorch are
   built openblas/mkl/cuda stacks, and so on. The user is eventually going to
   see the overlay, so to avoid confusion let's standardize on it.
											 
										 
										
											2020-05-09 19:11:09 -04:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								a virtual environment created by `venv` , and install Python modules through
							 
						 
					
						
							
								
									
										
										
										
											2020-02-09 11:23:11 -05:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								`pip`  the traditional way.
							 
						 
					
						
							
								
									
										
										
										
											2017-01-12 16:00:50 +00:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2020-02-09 11:23:11 -05:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								Create this `default.nix`  file, together with a `requirements.txt`  and simply
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								execute `nix-shell` .
							 
						 
					
						
							
								
									
										
										
										
											2017-01-12 16:00:50 +00:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-03-05 17:16:29 +01:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								```nix
							 
						 
					
						
							
								
									
										
										
										
											2020-01-12 18:27:17 +01:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								with import < nixpkgs >  { };
							 
						 
					
						
							
								
									
										
										
										
											2019-12-17 15:26:06 +01:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								let
							 
						 
					
						
							
								
									
										
										
										
											2020-01-12 18:27:17 +01:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								  pythonPackages = python3Packages;
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								in pkgs.mkShell rec {
							 
						 
					
						
							
								
									
										
										
										
											2017-01-12 16:00:50 +00:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								  name = "impurePythonEnv";
							 
						 
					
						
							
								
									
										
										
										
											2020-01-12 18:27:17 +01:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								  venvDir = "./.venv";
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								  buildInputs = [
							 
						 
					
						
							
								
									
										
											 
										 
										
											
												doc: Rewrite python onboarding tutorials in manual
Based on some feedback in #87094 and discussion with @fridh, this re-organizes
the onboarding tutorial in the Nixpkgs manual's python section, so that we start
with the simplest, most ad-hoc examples and work our way up. This progresses
from:
1. How to create an temporary python env at the cmdline, then
2. How to create a specific python env for a single script, then
3. How to create a specific python env for a project in a shell.nix, then
4. How to install a specific python env globally on the system or in a user profile.
Additionally, I've tried to standardize on some of the "best practice" ways of
doing things:
1. Instead of saying that this command style is "supported but strongly not
   discouraged", I've just deleted it to avoid confusion.
   Bad:  nix-shell -p python38Packages.numpy python38Packages.toolz
   Good: nix-shell -p 'python38.withPackages(ps: with ps; [ numpy toolz ])'
2. In the portion where we show how to add stuff to the user's
   `XDG_CONFIG_HOME`, use overlays instead of `config.nix`. The former can do
   everything the latter can do, but is also much more generic and powerful,
   because it can compose with other files, compose with other envs, compose
   with overlays that do things like swap whether tensorflow and pytorch are
   built openblas/mkl/cuda stacks, and so on. The user is eventually going to
   see the overlay, so to avoid confusion let's standardize on it.
											 
										 
										
											2020-05-09 19:11:09 -04:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								    # A Python interpreter including the 'venv' module is required to bootstrap
							 
						 
					
						
							
								
									
										
										
										
											2020-01-12 18:27:17 +01:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								    # the environment.
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    pythonPackages.python
							 
						 
					
						
							
								
									
										
										
										
											2019-03-22 22:50:30 -04:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2020-01-12 18:27:17 +01:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								    # This execute some shell code to initialize a venv in $venvDir before
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    # dropping into the shell
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    pythonPackages.venvShellHook
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    # Those are dependencies that we would like to use from nixpkgs, which will
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    # add them to PYTHONPATH and thus make them accessible from within the venv.
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    pythonPackages.numpy
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    pythonPackages.requests
							 
						 
					
						
							
								
									
										
										
										
											2019-03-22 22:50:30 -04:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2020-01-31 12:51:39 +01:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								    # In this particular example, in order to compile any binary extensions they may
							 
						 
					
						
							
								
									
										
											 
										 
										
											
												doc: Rewrite python onboarding tutorials in manual
Based on some feedback in #87094 and discussion with @fridh, this re-organizes
the onboarding tutorial in the Nixpkgs manual's python section, so that we start
with the simplest, most ad-hoc examples and work our way up. This progresses
from:
1. How to create an temporary python env at the cmdline, then
2. How to create a specific python env for a single script, then
3. How to create a specific python env for a project in a shell.nix, then
4. How to install a specific python env globally on the system or in a user profile.
Additionally, I've tried to standardize on some of the "best practice" ways of
doing things:
1. Instead of saying that this command style is "supported but strongly not
   discouraged", I've just deleted it to avoid confusion.
   Bad:  nix-shell -p python38Packages.numpy python38Packages.toolz
   Good: nix-shell -p 'python38.withPackages(ps: with ps; [ numpy toolz ])'
2. In the portion where we show how to add stuff to the user's
   `XDG_CONFIG_HOME`, use overlays instead of `config.nix`. The former can do
   everything the latter can do, but is also much more generic and powerful,
   because it can compose with other files, compose with other envs, compose
   with overlays that do things like swap whether tensorflow and pytorch are
   built openblas/mkl/cuda stacks, and so on. The user is eventually going to
   see the overlay, so to avoid confusion let's standardize on it.
											 
										 
										
											2020-05-09 19:11:09 -04:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								    # require, the Python modules listed in the hypothetical requirements.txt need
							 
						 
					
						
							
								
									
										
										
										
											2020-01-31 12:51:39 +01:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								    # the following packages to be installed locally:
							 
						 
					
						
							
								
									
										
										
										
											2017-01-12 16:00:50 +00:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								    taglib
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    openssl
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    git
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    libxml2
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    libxslt
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    libzip
							 
						 
					
						
							
								
									
										
										
										
											2019-03-22 22:50:30 -04:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								    zlib
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								  ];
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2020-05-16 00:34:11 -07:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								  # Run this command, only after creating the virtual environment
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								  postVenvCreation = ''
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    unset SOURCE_DATE_EPOCH
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    pip install -r requirements.txt
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								  '';
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2020-01-31 12:51:39 +01:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								  # Now we can execute any commands within the virtual environment.
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								  # This is optional and can be left out to run pip manually.
							 
						 
					
						
							
								
									
										
										
										
											2020-01-12 18:27:17 +01:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								  postShellHook = ''
							 
						 
					
						
							
								
									
										
										
										
											2020-05-16 00:34:11 -07:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								    # allow pip to install wheels
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    unset SOURCE_DATE_EPOCH
							 
						 
					
						
							
								
									
										
										
										
											2020-01-12 18:27:17 +01:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								  '';
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								}
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								```
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
											 
										 
										
											
												doc: Rewrite python onboarding tutorials in manual
Based on some feedback in #87094 and discussion with @fridh, this re-organizes
the onboarding tutorial in the Nixpkgs manual's python section, so that we start
with the simplest, most ad-hoc examples and work our way up. This progresses
from:
1. How to create an temporary python env at the cmdline, then
2. How to create a specific python env for a single script, then
3. How to create a specific python env for a project in a shell.nix, then
4. How to install a specific python env globally on the system or in a user profile.
Additionally, I've tried to standardize on some of the "best practice" ways of
doing things:
1. Instead of saying that this command style is "supported but strongly not
   discouraged", I've just deleted it to avoid confusion.
   Bad:  nix-shell -p python38Packages.numpy python38Packages.toolz
   Good: nix-shell -p 'python38.withPackages(ps: with ps; [ numpy toolz ])'
2. In the portion where we show how to add stuff to the user's
   `XDG_CONFIG_HOME`, use overlays instead of `config.nix`. The former can do
   everything the latter can do, but is also much more generic and powerful,
   because it can compose with other files, compose with other envs, compose
   with overlays that do things like swap whether tensorflow and pytorch are
   built openblas/mkl/cuda stacks, and so on. The user is eventually going to
   see the overlay, so to avoid confusion let's standardize on it.
											 
										 
										
											2020-05-09 19:11:09 -04:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								In case the supplied venvShellHook is insufficient, or when Python 2 support is
							 
						 
					
						
							
								
									
										
										
										
											2020-02-09 11:23:11 -05:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								needed, you can define your own shell hook and adapt to your needs like in the
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								following example:
							 
						 
					
						
							
								
									
										
										
										
											2020-01-12 18:27:17 +01:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								```nix
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								with import < nixpkgs >  { };
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								let
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								  venvDir = "./.venv";
							 
						 
					
						
							
								
									
										
										
										
											2020-01-31 12:51:39 +01:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								  pythonPackages = python3Packages;
							 
						 
					
						
							
								
									
										
										
										
											2020-01-12 18:27:17 +01:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								in pkgs.mkShell rec {
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								  name = "impurePythonEnv";
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								  buildInputs = [
							 
						 
					
						
							
								
									
										
										
										
											2020-01-31 12:51:39 +01:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								    pythonPackages.python
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    # Needed when using python 2.7
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    # pythonPackages.virtualenv
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    # ...
							 
						 
					
						
							
								
									
										
										
										
											2020-01-12 18:27:17 +01:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								  ];
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								  # This is very close to how venvShellHook is implemented, but
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								  # adapted to use 'virtualenv'
							 
						 
					
						
							
								
									
										
										
										
											2017-01-12 16:00:50 +00:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								  shellHook = ''
							 
						 
					
						
							
								
									
										
										
										
											2019-03-22 22:50:30 -04:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								    SOURCE_DATE_EPOCH=$(date +%s)
							 
						 
					
						
							
								
									
										
										
										
											2020-01-12 18:27:17 +01:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    if [ -d "${venvDir}" ]; then
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								      echo "Skipping venv creation, '${venvDir}' already exists"
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    else
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								      echo "Creating new venv environment in path: '${venvDir}'"
							 
						 
					
						
							
								
									
										
										
										
											2020-01-31 12:51:39 +01:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								      # Note that the module venv was only introduced in python 3, so for 2.7
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								      # this needs to be replaced with a call to virtualenv
							 
						 
					
						
							
								
									
										
										
										
											2020-01-12 18:27:17 +01:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								      ${pythonPackages.python.interpreter} -m venv "${venvDir}"
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    fi
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    # Under some circumstances it might be necessary to add your virtual
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    # environment to PYTHONPATH, which you can do here too;
							 
						 
					
						
							
								
									
										
										
										
											2020-01-31 12:51:39 +01:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								    # PYTHONPATH=$PWD/${venvDir}/${pythonPackages.python.sitePackages}/:$PYTHONPATH
							 
						 
					
						
							
								
									
										
										
										
											2020-01-12 18:27:17 +01:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    source "${venvDir}/bin/activate"
							 
						 
					
						
							
								
									
										
										
										
											2020-01-31 12:51:39 +01:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    # As in the previous example, this is optional.
							 
						 
					
						
							
								
									
										
										
										
											2019-03-22 22:50:30 -04:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								    pip install -r requirements.txt
							 
						 
					
						
							
								
									
										
										
										
											2017-01-12 16:00:50 +00:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								  '';
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								}
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								```
							 
						 
					
						
							
								
									
										
										
										
											2016-02-21 20:13:44 +01:00 
										
									 
								 
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-01-12 16:59:27 +00:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								Note that the `pip install`  is an imperative action. So every time `nix-shell` 
							 
						 
					
						
							
								
									
										
											 
										 
										
											
												doc: Rewrite python onboarding tutorials in manual
Based on some feedback in #87094 and discussion with @fridh, this re-organizes
the onboarding tutorial in the Nixpkgs manual's python section, so that we start
with the simplest, most ad-hoc examples and work our way up. This progresses
from:
1. How to create an temporary python env at the cmdline, then
2. How to create a specific python env for a single script, then
3. How to create a specific python env for a project in a shell.nix, then
4. How to install a specific python env globally on the system or in a user profile.
Additionally, I've tried to standardize on some of the "best practice" ways of
doing things:
1. Instead of saying that this command style is "supported but strongly not
   discouraged", I've just deleted it to avoid confusion.
   Bad:  nix-shell -p python38Packages.numpy python38Packages.toolz
   Good: nix-shell -p 'python38.withPackages(ps: with ps; [ numpy toolz ])'
2. In the portion where we show how to add stuff to the user's
   `XDG_CONFIG_HOME`, use overlays instead of `config.nix`. The former can do
   everything the latter can do, but is also much more generic and powerful,
   because it can compose with other files, compose with other envs, compose
   with overlays that do things like swap whether tensorflow and pytorch are
   built openblas/mkl/cuda stacks, and so on. The user is eventually going to
   see the overlay, so to avoid confusion let's standardize on it.
											 
										 
										
											2020-05-09 19:11:09 -04:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								is executed it will attempt to download the Python modules listed in
							 
						 
					
						
							
								
									
										
										
										
											2017-01-12 16:59:27 +00:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								requirements.txt. However these will be cached locally within the `virtualenv` 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								folder and not downloaded again.
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-03-21 00:06:51 +01:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								### How to override a Python package from `configuration.nix`?
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								If you need to change a package's attribute(s) from `configuration.nix`  you could do:
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								```nix
							 
						 
					
						
							
								
									
										
										
										
											2018-07-25 21:29:25 +02:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								  nixpkgs.config.packageOverrides = super: {
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    python = super.python.override {
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								      packageOverrides = python-self: python-super: {
							 
						 
					
						
							
								
									
										
										
										
											2018-07-25 21:32:16 +02:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								        zerobin = python-super.zerobin.overrideAttrs (oldAttrs: {
							 
						 
					
						
							
								
									
										
										
										
											2018-07-25 21:29:25 +02:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								          src = super.fetchgit {
							 
						 
					
						
							
								
									
										
										
										
											2018-07-25 21:32:16 +02:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								            url = "https://github.com/sametmax/0bin";
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								            rev = "a344dbb18fe7a855d0742b9a1cede7ce423b34ec";
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								            sha256 = "16d769kmnrpbdr0ph0whyf4yff5df6zi4kmwx7sz1d3r6c8p6xji";
							 
						 
					
						
							
								
									
										
										
										
											2017-03-21 00:06:51 +01:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								          };
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								        });
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								      };
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    };
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								  };
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								```
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2018-07-26 14:19:45 +02:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								`pythonPackages.zerobin`  is now globally overridden. All packages and also the
							 
						 
					
						
							
								
									
										
										
										
											2020-02-09 11:23:11 -05:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								`zerobin`  NixOS service use the new definition. Note that `python-super`  refers
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								to the old package set and `python-self`  to the new, overridden version.
							 
						 
					
						
							
								
									
										
										
										
											2018-07-25 21:29:25 +02:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2020-02-09 11:23:11 -05:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								To modify only a Python package set instead of a whole Python derivation, use
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								this snippet:
							 
						 
					
						
							
								
									
										
										
										
											2018-07-25 21:29:25 +02:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								```nix
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								  myPythonPackages = pythonPackages.override {
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    overrides = self: super: {
							 
						 
					
						
							
								
									
										
										
										
											2018-07-25 21:32:16 +02:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								      zerobin = ...;
							 
						 
					
						
							
								
									
										
										
										
											2018-07-25 21:29:25 +02:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								    };
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								  }
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								```
							 
						 
					
						
							
								
									
										
										
										
											2016-02-21 20:13:44 +01:00 
										
									 
								 
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-06-10 12:18:10 +02:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								### How to override a Python package using overlays?
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2018-07-25 21:29:25 +02:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								Use the following overlay template:
							 
						 
					
						
							
								
									
										
										
										
											2017-06-10 12:18:10 +02:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								```nix
							 
						 
					
						
							
								
									
										
										
										
											2018-10-18 15:00:48 -04:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								self: super: {
							 
						 
					
						
							
								
									
										
										
										
											2017-06-10 12:18:10 +02:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								  python = super.python.override {
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    packageOverrides = python-self: python-super: {
							 
						 
					
						
							
								
									
										
										
										
											2018-07-25 21:32:16 +02:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								      zerobin = python-super.zerobin.overrideAttrs (oldAttrs: {
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								        src = super.fetchgit {
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								          url = "https://github.com/sametmax/0bin";
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								          rev = "a344dbb18fe7a855d0742b9a1cede7ce423b34ec";
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								          sha256 = "16d769kmnrpbdr0ph0whyf4yff5df6zi4kmwx7sz1d3r6c8p6xji";
							 
						 
					
						
							
								
									
										
										
										
											2017-06-10 12:18:10 +02:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								        };
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								      });
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    };
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								  };
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								}
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								```
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2018-10-18 15:00:48 -04:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								### How to use Intel's MKL with numpy and scipy?
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
											 
										 
										
											
												doc: Rewrite python onboarding tutorials in manual
Based on some feedback in #87094 and discussion with @fridh, this re-organizes
the onboarding tutorial in the Nixpkgs manual's python section, so that we start
with the simplest, most ad-hoc examples and work our way up. This progresses
from:
1. How to create an temporary python env at the cmdline, then
2. How to create a specific python env for a single script, then
3. How to create a specific python env for a project in a shell.nix, then
4. How to install a specific python env globally on the system or in a user profile.
Additionally, I've tried to standardize on some of the "best practice" ways of
doing things:
1. Instead of saying that this command style is "supported but strongly not
   discouraged", I've just deleted it to avoid confusion.
   Bad:  nix-shell -p python38Packages.numpy python38Packages.toolz
   Good: nix-shell -p 'python38.withPackages(ps: with ps; [ numpy toolz ])'
2. In the portion where we show how to add stuff to the user's
   `XDG_CONFIG_HOME`, use overlays instead of `config.nix`. The former can do
   everything the latter can do, but is also much more generic and powerful,
   because it can compose with other files, compose with other envs, compose
   with overlays that do things like swap whether tensorflow and pytorch are
   built openblas/mkl/cuda stacks, and so on. The user is eventually going to
   see the overlay, so to avoid confusion let's standardize on it.
											 
										 
										
											2020-05-09 19:11:09 -04:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								MKL can be configured using an overlay. See the section "[Using overlays to
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								configure alternatives](#sec -overlays-alternatives-blas-lapack)".
							 
						 
					
						
							
								
									
										
										
										
											2018-10-23 17:33:49 -04:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2019-01-05 10:26:57 +01:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								### What inputs do `setup_requires`, `install_requires` and `tests_require` map to?
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								In a `setup.py`  or `setup.cfg`  it is common to declare dependencies:
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								*  `setup_requires`  corresponds to `nativeBuildInputs` 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								*  `install_requires`  corresponds to `propagatedBuildInputs` 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								*  `tests_require`  corresponds to `checkInputs` 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2016-02-21 20:13:44 +01:00 
										
									 
								 
							 
							
								
							 
							
								 
							 
							
							
								## Contributing
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								### Contributing guidelines
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								Following rules are desired to be respected:
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2020-02-09 11:23:11 -05:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								*  Python libraries are called from `python-packages.nix`  and packaged with
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								  `buildPythonPackage` . The expression of a library should be in
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								  `pkgs/development/python-modules/<name>/default.nix` . Libraries in
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								  `pkgs/top-level/python-packages.nix`  are sorted quasi-alphabetically to avoid
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								  merge conflicts.
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								*  Python applications live outside of `python-packages.nix`  and are packaged
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								  with `buildPythonApplication` .
							 
						 
					
						
							
								
									
										
										
										
											2017-02-22 13:38:02 +01:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								*  Make sure libraries build for all Python interpreters.
							 
						 
					
						
							
								
									
										
										
										
											2020-02-09 11:23:11 -05:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								*  By default we enable tests. Make sure the tests are found and, in the case of
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								  libraries, are passing for all interpreters. If certain tests fail they can be
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								  disabled individually. Try to avoid disabling the tests altogether. In any
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								  case, when you disable tests, leave a comment explaining why.
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								*  Commit names of Python libraries should reflect that they are Python
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								  libraries, so write for example `pythonPackages.numpy: 1.11 -> 1.12` .
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								*  Attribute names in `python-packages.nix`  should be normalized according to
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								  [PEP 0503 ](https://www.python.org/dev/peps/pep-0503/#normalized-names ). This
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								  means that characters should be converted to lowercase and `.`  and `_`  should
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								  be replaced by a single `-`  (foo-bar-baz instead of Foo__Bar.baz )