Python: Difference between revisions
imported>Tomberek mNo edit summary |
imported>Jtojnar GNOME: link the manual as the doc PR was merged |
||
Line 119: | Line 119: | ||
</syntaxhighlight> | </syntaxhighlight> | ||
== Special Modules == | == Special Modules == | ||
=== | === GNOME === | ||
<code>gobject-introspection</code> based python modules need some environment variables to work correctly. For standalone | <code>gobject-introspection</code> based python modules need some environment variables to work correctly. For standalone | ||
applications, <code>wrapGAppsHook</code> (see | applications, <code>wrapGAppsHook</code> (see the [relevant documentation https://nixos.org/nixpkgs/manual/#sec-language-gnome]) wraps the executable with the necessary variables. But this is not fit for development. | ||
In this case use a <code>nix-shell</code> with <code>gobject-introspection</code> and all the libraries you are using (gtk and so on) as <code>buildInputs</code>. | In this case use a <code>nix-shell</code> with <code>gobject-introspection</code> and all the libraries you are using (gtk and so on) as <code>buildInputs</code>. | ||
For example: | For example: |
Revision as of 02:31, 18 January 2020
The Python packages available to the interpreter must be declared when installing Python.
To install, say Python 3 with pandas
and requests
, define a new package python-with-my-packages
:
with pkgs;
let
my-python-packages = python-packages: with python-packages; [
pandas
requests
# other python packages you want
];
python-with-my-packages = python3.withPackages my-python-packages;
in ...
You can put python-with-my-packages
into your environment.systemPackages for a system-wide installation, for instance.
There are several versions of Python available. Replace python3
with python2
or pypy
in the above snippet according to your needs.
Explanation (optional)
We defined a function my-python-packages
which takes as input a set python-packages
and returns a list of attributes thereof.
Using alternative packages
We saw above how to install Python packages using nixpkgs. Since these are written by hand by nixpkgs maintainers, it isn't uncommon for packages you want to be missing or out of date.
pip
To install `pip` add virtualenvwrapper
to your list of Python packages above. Pure Python packages can be installed in a virtualenv using pip. The package pandas
in the example below won't work.
Put your packages in a requirements.txt:
pandas
requests
Then setup the virtualenv:
virtualenv my-new-python-venv
source my-new-python-venv/bin/activate
pip install -r requirements.txt
Emulating virtualenv with nix-shell
In some cases virtualenv fails to install a library because it requires patching on NixOS (example 1, example 2, general issue). In this cases it is better to replace those libraries with ones from Nix.
Let's say, that nanomsg library fails to install in virtualenv. Then write a `default.nix` file:
let pkgs = import <nixpkgs> {};
nanomsg-py = .... build expression for this python library;
in pkgs.stdenv.mkShell {
buildInputs = [
pkgs.pythonPackages.pip
nanomsg-py
];
shellHook = ''
alias pip="PIP_PREFIX='$(pwd)/_build/pip_packages' \pip"
export PYTHONPATH="$(pwd)/_build/pip_packages/lib/python2.7/site-packages:$PYTHONPATH"
unset SOURCE_DATE_EPOCH
'';
}
After entering the environment with `nix-shell`, you can install new python libraries with dump `pip install`, but nanomsg will be detected as installed.
Discussion and consequences of this approach are in PR https://github.com/NixOS/nixpkgs/pull/55265.
conda
Install the package conda
and run
conda-shell
conda-install
conda env update --file environment.yml
Imperative use
It is also possible to use conda-install
directly.
On first use, run
conda-shell
conda-install
to set up conda in ~/.conda
pypi2nix
Contribution guidelines
Libraries
According to the official guidelines for python new package expressions for libraries should be placed in pkgs/development/python-modules/<name>/default.nix
. Those expressions are then referenced from pkgs/top-level/python-packages.nix
like in this example:
{
aenum = callPackage ../development/python-modules/aenum { };
}
The reasoning behind this is the large size of pkgs/top-level/python-packages.nix
.
Applications
Python applications instead should be referenced directly from pkgs/top-level/all-packages.nix
.
The expression should take pythonPackages
as one of the arguments, which guarantees that packages belong to the same set. For example:
{ lib
, pythonPackages
}:
with pythonPackages;
buildPythonApplication rec {
# ...
Special Modules
GNOME
gobject-introspection
based python modules need some environment variables to work correctly. For standalone
applications, wrapGAppsHook
(see the [relevant documentation https://nixos.org/nixpkgs/manual/#sec-language-gnome]) wraps the executable with the necessary variables. But this is not fit for development.
In this case use a nix-shell
with gobject-introspection
and all the libraries you are using (gtk and so on) as buildInputs
.
For example:
$ nix-shell -p gobjectIntrospection gtk3 'python2.withPackages (ps: with ps; [ pygobject3 ])' --run "python -c \"import pygtkcompat; pygtkcompat.enable_gtk(version='3.0')\""
Or, if you want to use matplotlib interactively:
$ nix-shell -p gobjectIntrospection gtk3 'python36.withPackages(ps : with ps; [ matplotlib pygobject3 ipython ])'
$ ipython
In [1]: import matplotlib
In [2]: matplotlib.use('gtk3agg')
In [3]: import matplotlib.pyplot as plt
In [4]: plt.ion()
In [5]: plt.plot([1,3,2,4])
You can also set backend : GTK3Agg
in your ~/.config/matplotlib/matplotlibrc
file to avoid having to call matplotlib.use('gtk3agg')
.