<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom"><title>docs.pelican.bernatchez.net - python</title><link href="https://docs.pelican.bernatchez.net/lang-version.en/" rel="alternate"/><link href="https://docs.pelican.bernatchez.net/lang-version.en/feeds/python.atom.xml" rel="self"/><id>https://docs.pelican.bernatchez.net/lang-version.en/</id><updated>2025-05-24T18:23:52+00:00</updated><entry><title>Set up a personal python package index</title><link href="https://docs.pelican.bernatchez.net/lang-version.en/personal-pypi-en.html" rel="alternate"/><published>2025-05-24T18:23:52+00:00</published><updated>2025-05-24T18:23:52+00:00</updated><author><name>Pierre Bernatchez</name></author><id>tag:docs.pelican.bernatchez.net,2025-05-24:/lang-version.en/personal-pypi-en.html</id><summary type="html">&lt;p class="first last"&gt;Setting up the DEVPI primate package index for our packages.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;&lt;strong&gt;Overview&lt;/strong&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;This document describes setting up a private package index as a more convenient way to distribute python packages.&lt;/p&gt;
&lt;p&gt;The need to use something like this grows as we add maintainers and packages to maintain.&lt;/p&gt;
&lt;p&gt;Our python packages need to be compatile with the standard python package index PyPi.&lt;/p&gt;
&lt;p&gt;We use a private package index until we are ready to make a package available to the general public,
then we switch to PyPi.&lt;/p&gt;
&lt;p&gt;This tool we are using keeps our packages compatible with PyPi for when we do make it available there.&lt;/p&gt;
&lt;p&gt;&lt;a class="reference external" href="https://devpi.net/docs/devpi/devpi/stable/+doc/quickstart-releaseprocess.html"&gt;devpi&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;It is a conforming package index system.&lt;/p&gt;
&lt;p&gt;We will use it to serve our private  package index.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;div class="section" id="configuring-the-sw-for-devpi"&gt;
&lt;h2&gt;Configuring the SW for devpi&lt;/h2&gt;
&lt;p&gt;This howto is derived from the following tutorial:&lt;/p&gt;
&lt;p&gt;&amp;lt;&lt;a class="reference external" href="https://devpi.net/docs/devpi/devpi/stable/+doc/quickstart-releaseprocess.html"&gt;https://devpi.net/docs/devpi/devpi/stable/+doc/quickstart-releaseprocess.html&lt;/a&gt;&amp;gt;_&lt;/p&gt;
&lt;p&gt;We are working with python3.
We want to setup up a virtual environment that conforms to our assumptions, and then install within that.
We call the environment devpi_venv.
We create a directory for our setup first.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;mkdir&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;HOME&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;/devpi_setup
&lt;span class="nb"&gt;cd&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;HOME&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;/devpi_setup
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;We install the bare essentials.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;python3&lt;span class="w"&gt; &lt;/span&gt;-m&lt;span class="w"&gt; &lt;/span&gt;venv&lt;span class="w"&gt; &lt;/span&gt;devpi_venv
&lt;span class="nb"&gt;source&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;devpi_venv/bin/activate
python&lt;span class="w"&gt; &lt;/span&gt;-m&lt;span class="w"&gt; &lt;/span&gt;pip&lt;span class="w"&gt; &lt;/span&gt;install&lt;span class="w"&gt; &lt;/span&gt;-U&lt;span class="w"&gt; &lt;/span&gt;pip
pip&lt;span class="w"&gt; &lt;/span&gt;install&lt;span class="w"&gt; &lt;/span&gt;wheel
pip&lt;span class="w"&gt; &lt;/span&gt;install&lt;span class="w"&gt; &lt;/span&gt;setuptools
pip&lt;span class="w"&gt; &lt;/span&gt;install&lt;span class="w"&gt; &lt;/span&gt;twine
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&lt;em&gt;restview&lt;/em&gt; is A Restructured Text format viewer I find usefull. (optional)&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;pip&lt;span class="w"&gt; &lt;/span&gt;install&lt;span class="w"&gt; &lt;/span&gt;restview
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;You invoke it and it keeps re-rendering your file as you modify it.&lt;/p&gt;
&lt;p&gt;Like this:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;restview&lt;span class="w"&gt; &lt;/span&gt;README.rst
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&lt;em&gt;rst2pdf&lt;/em&gt; is convenient for generating pdf copies of .rst documuents.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;pip&lt;span class="w"&gt; &lt;/span&gt;install&lt;span class="w"&gt; &lt;/span&gt;rst2pdf
rst2pdf&lt;span class="w"&gt; &lt;/span&gt;doc/privatepypi.rst&lt;span class="w"&gt; &lt;/span&gt;-o&lt;span class="w"&gt; &lt;/span&gt;reformatted_docs/privatepypi.pdf
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;div class="section" id="set-up-devpi-server-on-our-laptop"&gt;
&lt;h2&gt;Set up devpi server on our laptop&lt;/h2&gt;
&lt;p&gt;Install devpi client and web server
The non web server - devpi-server - is  installed as a consequence.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;pip&lt;span class="w"&gt; &lt;/span&gt;install&lt;span class="w"&gt; &lt;/span&gt;-U&lt;span class="w"&gt; &lt;/span&gt;devpi-web&lt;span class="w"&gt; &lt;/span&gt;devpi-client
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Initialize an empty index (at /var/devpi-server by default)
Note I had a permissions problem with the init one.
So first I manually do this:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;sudo&lt;span class="w"&gt; &lt;/span&gt;mkdir&lt;span class="w"&gt;  &lt;/span&gt;/var/devpi-server
sudo&lt;span class="w"&gt; &lt;/span&gt;chown&lt;span class="w"&gt; &lt;/span&gt;ubuntu:ubuntu&lt;span class="w"&gt; &lt;/span&gt;/var/devpi-server
&lt;/pre&gt;&lt;/div&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;devpi-init
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;We want a config file for supervisor daemon to use.
This will generate a bunch of config files under the current
directory, the one we want included.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="nb"&gt;cd&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;HOME&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;/devpi_setup
devpi-gen-config
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;This gives us the file gen-config/supervisor-devpi.conf
to copy to /etc/supervisor/conf so that we can start
up the server.  I started by editing it to say
start=False so that it would need to be started
up manually.  Then I copied it to the right place for it.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;sudo&lt;span class="w"&gt; &lt;/span&gt;cp&lt;span class="w"&gt; &lt;/span&gt;gen-config/supervisor-devpi.conf&lt;span class="w"&gt; &lt;/span&gt;/etc/supervisor/conf.d/devpi-server.conf
sudo&lt;span class="w"&gt; &lt;/span&gt;supervisorctl&lt;span class="w"&gt; &lt;/span&gt;update
sudo&lt;span class="w"&gt; &lt;/span&gt;supervisorctl&lt;span class="w"&gt; &lt;/span&gt;start&lt;span class="w"&gt; &lt;/span&gt;devpi-server
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Create a user, login as him and create the 'dev' index&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;devpi&lt;span class="w"&gt; &lt;/span&gt;user&lt;span class="w"&gt; &lt;/span&gt;-c&lt;span class="w"&gt; &lt;/span&gt;pbernatchez&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;password&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;foobar
devpi&lt;span class="w"&gt; &lt;/span&gt;login&lt;span class="w"&gt; &lt;/span&gt;pbernatchez&lt;span class="w"&gt; &lt;/span&gt;--password&lt;span class="o"&gt;=&lt;/span&gt;foobar
devpi&lt;span class="w"&gt; &lt;/span&gt;index&lt;span class="w"&gt; &lt;/span&gt;-c&lt;span class="w"&gt; &lt;/span&gt;dev&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;bases&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;root/pypi
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Use our dev index&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;devpi&lt;span class="w"&gt; &lt;/span&gt;use&lt;span class="w"&gt; &lt;/span&gt;testuser/dev
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Now we can make use of the private index.&lt;/p&gt;
&lt;p&gt;We are using flit to publish to our index and it relies on the file : ~/.pypirc.&lt;/p&gt;
&lt;p&gt;So we make an entry there for our index.&lt;/p&gt;
&lt;p&gt;I gave it the name 'mypypi':&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;[distutils]
index-servers =
   mypypi
   testpypi

[mypypi]
repository = http://localhost:3141/pbernatchez/dev
username = pbernatchez

[testpypi]
repository = https://test.pypi.org/legacy/
username = pbernatchez
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;From here on, using flit, we can refer it as 'mypypi'.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;deactivate
&lt;span class="nb"&gt;cd&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;/home/ubuntu/allrepos/animbboard
&lt;span class="nb"&gt;source&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;HOME&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;/venv_animbboard/bin/activate
flit&lt;span class="w"&gt; &lt;/span&gt;build
flit&lt;span class="w"&gt; &lt;/span&gt;publish&lt;span class="w"&gt; &lt;/span&gt;--repository&lt;span class="w"&gt; &lt;/span&gt;mypypi
pip&lt;span class="w"&gt; &lt;/span&gt;uninstall&lt;span class="w"&gt;  &lt;/span&gt;animbboard
pip&lt;span class="w"&gt; &lt;/span&gt;install&lt;span class="w"&gt; &lt;/span&gt;-i&lt;span class="w"&gt; &lt;/span&gt;http://localhost:3141/pbernatchez/dev&lt;span class="w"&gt;  &lt;/span&gt;animbboard
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
</content><category term="python"/><category term="python"/><category term="package"/><category term="index"/><category term="distribution"/><category term="software"/><category term="deployment"/><category term="revision"/><category term="how to"/></entry><entry><title>Set up a private package index</title><link href="https://docs.pelican.bernatchez.net/lang-version.en/privatepypi-en.html" rel="alternate"/><published>2025-05-24T18:23:52+00:00</published><updated>2025-05-24T18:23:52+00:00</updated><author><name>Pierre Bernatchez</name></author><id>tag:docs.pelican.bernatchez.net,2025-05-24:/lang-version.en/privatepypi-en.html</id><summary type="html">&lt;p class="first last"&gt;set up a private package index&lt;/p&gt;
</summary><content type="html">&lt;div class="section" id="overview"&gt;
&lt;h2&gt;Overview&lt;/h2&gt;
&lt;blockquote&gt;
&lt;p&gt;At this writing our current practise is to generate versioned
tarballs and to 'pip install' from those.&lt;/p&gt;
&lt;p&gt;This describes setting up a private package index as a more
convenient alternative to using tarballs directly.&lt;/p&gt;
&lt;p&gt;Our python software needs to be kept compatible with the standard
python package index for when we desire to offer it to the general
public.&lt;/p&gt;
&lt;p&gt;To ensure we are staying compatible with pypi, we need to run it
through the process, but with a conforming private packaging
index.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;devpi&lt;/strong&gt; to the rescue ('&lt;a class="reference external" href="https://www.devpi.net/"&gt;https://www.devpi.net/&lt;/a&gt;') .&lt;/p&gt;
&lt;p&gt;It is a conforming package index system we can use to serve our
private packages whithout releasing them to the public.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;/div&gt;
&lt;div class="section" id="configuring-the-sw-for-devpi"&gt;
&lt;h2&gt;Configuring the SW for  devpi&lt;/h2&gt;
&lt;blockquote&gt;
&lt;p&gt;This information is derived from the following tutorial:&lt;/p&gt;
&lt;p&gt;&amp;lt;&lt;a class="reference external" href="https://devpi.net/docs/devpi/devpi/stable/+doc/quickstart-releaseprocess.html"&gt;https://devpi.net/docs/devpi/devpi/stable/+doc/quickstart-releaseprocess.html&lt;/a&gt;&amp;gt;_&lt;/p&gt;
&lt;p&gt;We start by creating a virtual environment called &amp;quot;venv_devpi&amp;quot; by
following the steps described in the document virtualenv.&lt;/p&gt;
&lt;p&gt;Then we activate that environment and continue with the steps below.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;/div&gt;
&lt;div class="section" id="set-up-devpi-server-on-our-laptop"&gt;
&lt;h2&gt;Set up devpi server on our laptop&lt;/h2&gt;
&lt;blockquote&gt;
&lt;p&gt;Install a devpi client and web server&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;pip&lt;span class="w"&gt; &lt;/span&gt;install&lt;span class="w"&gt; &lt;/span&gt;-U&lt;span class="w"&gt; &lt;/span&gt;devpi-web&lt;span class="w"&gt; &lt;/span&gt;devpi-client
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Note:&lt;/p&gt;
&lt;pre class="literal-block"&gt;
The non-web server - devpi-server - is also installed as a side effect.
&lt;/pre&gt;
&lt;p&gt;We must avoid needing sudo to access the index, so instead we change
ownership from root to the logged in user. We also need to make sure
supervisor runs our server as that user.&lt;/p&gt;
&lt;p&gt;First manually do this:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;sudo&lt;span class="w"&gt; &lt;/span&gt;mkdir&lt;span class="w"&gt; &lt;/span&gt;-p&lt;span class="w"&gt; &lt;/span&gt;/var/devpi-server
sudo&lt;span class="w"&gt; &lt;/span&gt;chown&lt;span class="w"&gt; &lt;/span&gt;-R&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;$(&lt;/span&gt;logname&lt;span class="k"&gt;)&lt;/span&gt;:&lt;span class="k"&gt;$(&lt;/span&gt;logname&lt;span class="k"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;/var/devpi-server
ls&lt;span class="w"&gt; &lt;/span&gt;-ld&lt;span class="w"&gt; &lt;/span&gt;/var/devpi-server
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Initialize an empty index (at /var/devpi-server by default)&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;devpi-init
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Make a place to put our configuration data files:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;mkdir&lt;span class="w"&gt; &lt;/span&gt;-p&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;HOME&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;/devpi_setup
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;The following will generate a bunch of config files, one of which we
will need, under the current directory. Putting that stuff in
${HOME}/devpi_setup.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="nb"&gt;pushd&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;.&lt;span class="w"&gt; &lt;/span&gt;&amp;gt;/dev/null
&lt;span class="nb"&gt;cd&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;HOME&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;/devpi_setup
devpi-gen-config
&lt;span class="nb"&gt;popd&lt;/span&gt;&lt;span class="w"&gt;  &lt;/span&gt;&amp;gt;/dev/null
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Note:&lt;/p&gt;
&lt;pre class="literal-block"&gt;
This gave us the file  ${HOME}/devpi_setup/gen-config/supervisor-devpi.conf
as a config file to start up our pypi server.  Start by editing
it manually to say autostart=False so that it will need to be
started up manually.
&lt;/pre&gt;
&lt;p&gt;Append a line like &amp;quot;user = username&amp;quot; to the configuration so it
launches as that user, the same user as above.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="nb"&gt;echo&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;user&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;$(&lt;/span&gt;logname&lt;span class="k"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&amp;gt;&amp;gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;HOME&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;/devpi_setup/gen-config/supervisor-devpi.conf
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Copy the config where where it needs to be, then start our server.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;sudo&lt;span class="w"&gt; &lt;/span&gt;cp&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;HOME&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;/devpi_setup/gen-config/supervisor-devpi.conf&lt;span class="w"&gt; &lt;/span&gt;/etc/supervisor/conf.d/supervisor-devpi.conf
sudo&lt;span class="w"&gt; &lt;/span&gt;supervisorctl&lt;span class="w"&gt; &lt;/span&gt;update
sudo&lt;span class="w"&gt; &lt;/span&gt;supervisorctl&lt;span class="w"&gt; &lt;/span&gt;start&lt;span class="w"&gt; &lt;/span&gt;devpi-server
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Create a user (within the server), login as that user and create the 'bzdev' index&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;devpi&lt;span class="w"&gt; &lt;/span&gt;use&lt;span class="w"&gt; &lt;/span&gt;http://localhost:3141
devpi&lt;span class="w"&gt; &lt;/span&gt;user&lt;span class="w"&gt; &lt;/span&gt;-c&lt;span class="w"&gt; &lt;/span&gt;pbernatchez&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;password&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;dummy
devpi&lt;span class="w"&gt; &lt;/span&gt;login&lt;span class="w"&gt; &lt;/span&gt;pbernatchez&lt;span class="w"&gt; &lt;/span&gt;--password&lt;span class="o"&gt;=&lt;/span&gt;dummy
devpi&lt;span class="w"&gt; &lt;/span&gt;index&lt;span class="w"&gt; &lt;/span&gt;-c&lt;span class="w"&gt; &lt;/span&gt;bzdev&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;bases&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;root/pypi
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Use our bzdev index&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;devpi&lt;span class="w"&gt; &lt;/span&gt;use&lt;span class="w"&gt; &lt;/span&gt;pbernatchez/bzdev
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Now we can make use of our private index.&lt;/p&gt;
&lt;p&gt;We are using flit to publish to our index and it
relies on the file : ~/.pypirc.&lt;/p&gt;
&lt;p&gt;For pip I named it 'bzdevpi'.
So we make an entry there for our index:&lt;/p&gt;
&lt;pre class="literal-block"&gt;
[distutils]
index-servers =
   bzdevpi
   testpypi

[bzdevpi]
repository = http://localhost:3141/pbernatchez/bzdev
username = pbernatchez

[testpypi]
repository = https://test.pypi.org/legacy/
username = pbernatchez
&lt;/pre&gt;
&lt;p&gt;From here on, using flit,&lt;/p&gt;
&lt;div class="line-block"&gt;
&lt;div class="line"&gt;To publish,&lt;/div&gt;
&lt;div class="line"&gt;flit publish --repository bzdevpi&lt;/div&gt;
&lt;div class="line"&gt;To install,&lt;/div&gt;
&lt;div class="line"&gt;pip install -i &lt;a class="reference external" href="http://localhost:3141/pbernatchez/bzdev"&gt;http://localhost:3141/pbernatchez/bzdev&lt;/a&gt;   foobar&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Example:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;deactivate
&lt;span class="nb"&gt;cd&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;/home/ubuntu/allrepos/wait_ssh
&lt;span class="nb"&gt;source&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;HOME&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;/venv_generic/bin/activate
flit&lt;span class="w"&gt; &lt;/span&gt;build
flit&lt;span class="w"&gt; &lt;/span&gt;publish&lt;span class="w"&gt; &lt;/span&gt;--repository&lt;span class="w"&gt; &lt;/span&gt;bzdevpi
pip&lt;span class="w"&gt; &lt;/span&gt;uninstall&lt;span class="w"&gt; &lt;/span&gt;wait_ssh
pip&lt;span class="w"&gt; &lt;/span&gt;install&lt;span class="w"&gt; &lt;/span&gt;-i&lt;span class="w"&gt; &lt;/span&gt;http://localhost:3141/pbernatchez/bzdev&lt;span class="w"&gt; &lt;/span&gt;wait_ssh
&lt;/pre&gt;&lt;/div&gt;
&lt;/blockquote&gt;
&lt;/div&gt;
</content><category term="python"/><category term="python"/><category term="package"/><category term="index"/><category term="distribution"/><category term="software"/><category term="deployment"/><category term="revision"/><category term="how to"/></entry><entry><title>Set up a python virtual environment</title><link href="https://docs.pelican.bernatchez.net/lang-version.en/venv-en.html" rel="alternate"/><published>2025-05-24T18:23:52+00:00</published><updated>2025-05-24T18:23:52+00:00</updated><author><name>Pierre Bernatchez</name></author><id>tag:docs.pelican.bernatchez.net,2025-05-24:/lang-version.en/venv-en.html</id><summary type="html">&lt;p class="first last"&gt;set up a python virtual environment&lt;/p&gt;
</summary><content type="html">&lt;p&gt;&lt;strong&gt;Make sure ubuntu system version is recent enough&lt;/strong&gt;&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;lsb_release&lt;span class="w"&gt; &lt;/span&gt;-a
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Output  (or higher)&lt;/p&gt;
&lt;pre class="literal-block"&gt;
Distributor ID:     Ubuntu

Description:        Ubuntu 24.04.3 LTS

Release:            24.04

Codename:           noble
&lt;/pre&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;python3&lt;span class="w"&gt; &lt;/span&gt;-V
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Output&lt;/p&gt;
&lt;dl class="docutils"&gt;
&lt;dt&gt;::&lt;/dt&gt;
&lt;dd&gt;Python 3.12.3&lt;/dd&gt;
&lt;/dl&gt;
&lt;p&gt;&lt;strong&gt;Make a base for all our virtual environments&lt;/strong&gt;&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;mkdir&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;HOME&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;/.venv
&lt;span class="c1"&gt;# Now we can create all our virtual environments  under ${HOME}/.venv/&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&lt;strong&gt;Make a Python Virtual Environment&lt;/strong&gt;&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="c1"&gt;# Here we call our first environment devpi&lt;/span&gt;
&lt;span class="nb"&gt;cd&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;HOME&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;/.venv/
python3&lt;span class="w"&gt; &lt;/span&gt;-m&lt;span class="w"&gt; &lt;/span&gt;venv&lt;span class="w"&gt; &lt;/span&gt;devpi
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&lt;strong&gt;OR using venvwrapper&lt;/strong&gt;&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;mkvenv&lt;span class="w"&gt; &lt;/span&gt;devpi
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Once we have our environment created.
We can install the elements we need to get started.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Activate It&lt;/strong&gt;&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="nb"&gt;source&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;HOME&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;/.venv/devpi/bin/activate
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&lt;strong&gt;Or with venvwrapper&lt;/strong&gt;&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;venv&lt;span class="w"&gt; &lt;/span&gt;devpi
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&lt;strong&gt;install the basics&lt;/strong&gt;&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="c1"&gt;# install&lt;/span&gt;
python&lt;span class="w"&gt; &lt;/span&gt;-m&lt;span class="w"&gt; &lt;/span&gt;pip&lt;span class="w"&gt; &lt;/span&gt;install&lt;span class="w"&gt; &lt;/span&gt;-U&lt;span class="w"&gt; &lt;/span&gt;pip
pip&lt;span class="w"&gt; &lt;/span&gt;install&lt;span class="w"&gt; &lt;/span&gt;wheel
pip&lt;span class="w"&gt; &lt;/span&gt;install&lt;span class="w"&gt; &lt;/span&gt;setuptools
pip&lt;span class="w"&gt; &lt;/span&gt;install&lt;span class="w"&gt; &lt;/span&gt;twine
pip&lt;span class="w"&gt; &lt;/span&gt;install&lt;span class="w"&gt; &lt;/span&gt;rst2pdf
pip&lt;span class="w"&gt; &lt;/span&gt;install&lt;span class="w"&gt; &lt;/span&gt;flit

&lt;span class="c1"&gt;# de-activate&lt;/span&gt;
deactivate
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&lt;strong&gt;Saving prerequisites&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Once your virtual environment is complete, it is nice to save the context.
Then you can quicky restore your virtual environment from scratch if need be.&lt;/p&gt;
&lt;p&gt;While Activated&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;pip&lt;span class="w"&gt; &lt;/span&gt;freeze&lt;span class="w"&gt; &lt;/span&gt;&amp;gt;requirements.txt

&lt;span class="c1"&gt;# It may be a good idea to keep such files under version control.&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&lt;strong&gt;Recovering&lt;/strong&gt;
While Activated&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;pip&lt;span class="w"&gt; &lt;/span&gt;install&lt;span class="w"&gt; &lt;/span&gt;-r&lt;span class="w"&gt; &lt;/span&gt;requirements.txt
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&lt;strong&gt;Automatic activation&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;In many cases we want to activate a project whenever we log in.
We can do that automatically by adding something like this to .bashrc and/or .profile&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="c1"&gt;#&lt;/span&gt;
&lt;span class="c1"&gt;# Added for automatic vitual environment activation&lt;/span&gt;
&lt;span class="c1"&gt;#&lt;/span&gt;
&lt;span class="k"&gt;if&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;-f&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;HOME&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;/.venv/devpi/bin/activate&amp;quot;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;then&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nb"&gt;source&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;HOME&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;/.venv/devpi/bin/activate
&lt;span class="k"&gt;fi&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;OR with venvwrapper&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="c1"&gt;#&lt;/span&gt;
&lt;span class="c1"&gt;# Added for automatic vitual environment activation&lt;/span&gt;
&lt;span class="c1"&gt;#&lt;/span&gt;
&lt;span class="nv"&gt;VENV_HOME&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;HOME&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;/.venv
&lt;span class="nv"&gt;venv_wrapper&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="k"&gt;$(&lt;/span&gt;which&lt;span class="w"&gt; &lt;/span&gt;venvwrapper.sh&lt;span class="k"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;if&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;[[&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;-n&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;$venv_wrapper&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;]]&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;then&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nb"&gt;source&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;$venv_wrapper&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;venv&lt;span class="w"&gt; &lt;/span&gt;devpi
&lt;span class="k"&gt;fi&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
</content><category term="python"/><category term="ubuntu"/><category term="python"/><category term="package"/><category term="distribution"/><category term="software"/><category term="deployment"/><category term="virtual environment"/><category term="how to"/></entry><entry><title>python virtual environment</title><link href="https://docs.pelican.bernatchez.net/lang-version.en/virtualenv-en.html" rel="alternate"/><published>2025-05-24T18:23:52+00:00</published><updated>2025-05-24T18:23:52+00:00</updated><author><name>Pierre Bernatchez</name></author><id>tag:docs.pelican.bernatchez.net,2025-05-24:/lang-version.en/virtualenv-en.html</id><summary type="html">&lt;p class="first last"&gt;set up a python virtual environment&lt;/p&gt;
</summary><content type="html">&lt;p&gt;&lt;strong&gt;Python Virtual Environment Setup&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;To have a good control over pre-requisite library modules for our
software, we run in a python virtual environment.&lt;/p&gt;
&lt;p&gt;That means that whenever you want to use or maintain the software
you must first activate that virtual environment like this:
(replace 'generic' with an existing project environment name)&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="nb"&gt;source&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;HOME&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;/venv_generic/bin/activate
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Once active you can deactivate it like this:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;deactivate
&lt;/pre&gt;&lt;/div&gt;
&lt;div class="section" id="installation"&gt;
&lt;h2&gt;Installation&lt;/h2&gt;
&lt;p&gt;We install any non pip packages we rely on, if any, first.
Then we install virtualenv.
Then we create a virtual environment.
Then we activate it.&lt;/p&gt;
&lt;p&gt;Install virtualenv itself.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;sudo&lt;span class="w"&gt; &lt;/span&gt;apt&lt;span class="w"&gt; &lt;/span&gt;update
sudo&lt;span class="w"&gt; &lt;/span&gt;apt&lt;span class="w"&gt; &lt;/span&gt;install&lt;span class="w"&gt; &lt;/span&gt;virtualenv
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Install a .rst to .pdf converter.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;snap&lt;span class="w"&gt; &lt;/span&gt;install&lt;span class="w"&gt; &lt;/span&gt;rst2pdf
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Create a virtual environment for the project&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;virtualenv&lt;span class="w"&gt; &lt;/span&gt;--prompt&lt;span class="w"&gt; &lt;/span&gt;venv_generic&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;HOME&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;/venv_generic
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Then activate the created environment&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="nb"&gt;source&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;HOME&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;/venv_generic/bin/activate
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Now we install modules our project will need, first pip itself and the
tools it needs.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;python3&lt;span class="w"&gt; &lt;/span&gt;-m&lt;span class="w"&gt; &lt;/span&gt;pip&lt;span class="w"&gt; &lt;/span&gt;install&lt;span class="w"&gt; &lt;/span&gt;-U&lt;span class="w"&gt; &lt;/span&gt;pip
pip&lt;span class="w"&gt; &lt;/span&gt;install&lt;span class="w"&gt; &lt;/span&gt;wheel
pip&lt;span class="w"&gt; &lt;/span&gt;install&lt;span class="w"&gt; &lt;/span&gt;setuptools
pip&lt;span class="w"&gt; &lt;/span&gt;install&lt;span class="w"&gt; &lt;/span&gt;twine
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;We are using flit for building and installling our software.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;pip&lt;span class="w"&gt; &lt;/span&gt;install&lt;span class="w"&gt; &lt;/span&gt;flit
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;div class="section" id="saving-prerequisites"&gt;
&lt;h2&gt;Saving prerequisites&lt;/h2&gt;
&lt;p&gt;We keep our dependencies under version control, so each time
we install more components we need to refresh our requirements
file.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;pip&lt;span class="w"&gt; &lt;/span&gt;freeze&lt;span class="w"&gt; &lt;/span&gt;&amp;gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;HOME&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;/allrepos/generic/requirements.txt
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;div class="section" id="reinstalling"&gt;
&lt;h2&gt;Reinstalling&lt;/h2&gt;
&lt;p&gt;Later, when we are migrating to a different workstation, or for some
reason need to restablish our project from scratch, we can install all
our prerequisites in one shot instead of installing items one at a
time like we did above.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;pip&lt;span class="w"&gt; &lt;/span&gt;install&lt;span class="w"&gt; &lt;/span&gt;-r&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;HOME&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;/allrepos/generic/requirements.txt
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;div class="section" id="automatic-activation"&gt;
&lt;h2&gt;Automatic activation&lt;/h2&gt;
&lt;p&gt;In many cases we want to activate a project whenver we log in, so lets
do that automatically.&lt;/p&gt;
&lt;p&gt;Append this snippet to the end of our &amp;quot;${HOME}/.bashrc&amp;quot; file.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="c1"&gt;#&lt;/span&gt;
&lt;span class="c1"&gt;# Added for automatic vitual environment activation&lt;/span&gt;
&lt;span class="c1"&gt;#&lt;/span&gt;
&lt;span class="k"&gt;if&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;-f&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;HOME&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;/venv_generic/bin/activate&amp;quot;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;then&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nb"&gt;source&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;HOME&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;/venv_generic/bin/activate
&lt;span class="k"&gt;fi&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;div class="section" id="good-ignoring-keeps-flit-happy"&gt;
&lt;h2&gt;Good ignoring keeps flit happy&lt;/h2&gt;
&lt;p&gt;Flit works nicely with git, but it is quite strict, so we must ignore
all irrelevant files properly or flit will reject builds.&lt;/p&gt;
&lt;p&gt;Below is a good start for a project &amp;quot;.gitignore&amp;quot; file:&lt;/p&gt;
&lt;pre class="literal-block"&gt;
*~
\#*\#
dist/*
pdf_docs/*
html_docs/*
&lt;/pre&gt;
&lt;/div&gt;
</content><category term="python"/><category term="python"/><category term="package"/><category term="distribution"/><category term="software"/><category term="deployment"/><category term="virtual environment"/><category term="how to"/></entry><entry><title>Set Up A Wrapper For Venv Environments</title><link href="https://docs.pelican.bernatchez.net/lang-version.en/vwrapper-en.html" rel="alternate"/><published>2025-05-24T18:23:52+00:00</published><updated>2025-05-24T18:23:52+00:00</updated><author><name>Pierre Bernatchez</name></author><id>tag:docs.pelican.bernatchez.net,2025-05-24:/lang-version.en/vwrapper-en.html</id><summary type="html">&lt;p class="first last"&gt;virtual environment wrapper setup&lt;/p&gt;
</summary><content type="html">&lt;p&gt;To maintain more than one python project at a time we leverage the the
builtin python venv tool for creating and using virtual environments.&lt;/p&gt;
&lt;p&gt;The venvwrapper package helps to keep the maintenance of multiple virtual
environments easier.  In short venv is enough, but venvwrapper makes it
easier.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Installation&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Install the venvwrapper package into your default system Python 3.
That is, with no virtual environment active.
This installs &lt;em&gt;venvwrapper.sh&lt;/em&gt; so that it is available in PATH&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;sudo&lt;span class="w"&gt; &lt;/span&gt;pip3&lt;span class="w"&gt; &lt;/span&gt;install&lt;span class="w"&gt; &lt;/span&gt;--break-system-packages&lt;span class="w"&gt; &lt;/span&gt;venvwrapper
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Check that it is indeed available&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;which&lt;span class="w"&gt; &lt;/span&gt;venvwrapper.sh
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&lt;strong&gt;Set up automatic activation of venvwrapper&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Add the code snippet below to one or both of these two files.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;HOME&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;/.bashrc
&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;HOME&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;/.profile
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Code snippet:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="nv"&gt;VENV_HOME&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;HOME&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;/.venv
&lt;span class="nv"&gt;venv_wrapper&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="k"&gt;$(&lt;/span&gt;which&lt;span class="w"&gt; &lt;/span&gt;venvwrapper.sh&lt;span class="k"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;if&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;[[&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;-n&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;venv_wrapper&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;]]&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;then&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nb"&gt;source&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;venv_wrapper&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;
&lt;span class="k"&gt;fi&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&lt;strong&gt;Now Once you open a terminal window you have access to these commands&lt;/strong&gt;&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;mkvenv&lt;span class="w"&gt; &lt;/span&gt;devpi&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="c1"&gt;# create and activate a new virtual environment&lt;/span&gt;
venv&lt;span class="w"&gt;   &lt;/span&gt;devpi&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="c1"&gt;# activate an existing virtual environment&lt;/span&gt;
rmvenv&lt;span class="w"&gt; &lt;/span&gt;devpi&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="c1"&gt;# remove one or more virtual environments&lt;/span&gt;
lsvenv&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="c1"&gt;# list existing virtual environments&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
</content><category term="python"/><category term="ubuntu"/><category term="python"/><category term="package"/><category term="distribution"/><category term="software"/><category term="deployment"/><category term="virtual environment"/><category term="how to"/></entry></feed>