Non IDE development strategy - what do others do that's fairly simple?
Cameron Simpson
cs at cskk.id.au
Sun Aug 2 01:03:54 EDT 2020
On 29Jul2020 11:20, Chris Green <cl at isbd.net> wrote:
>The existing code simply lives in ~/bin with a couple of modules in
>~/bin/pymods (which directory is in my PYTHONPATH).
>
>I use mercurial for configuration management of the code, directly in
>the ~/bin directory. This works fine for the sort of minor bug fixing
>and updates that I do most of the time, I'm the only user so changing
>the 'live' code isn't a major issue and I can always drop back to the
>last working version using mercurial.
Step 1 is to copy this sideways: keep the existing setup, but do the dev
in a separate directory. The Mykefile in my personal dev directory has a
"_home" target which installed the current state of play into my home
directory.
Once you have that, it is easy to make more clones to pursue things
separately.
>So, finally to the question, does anyone else have this command line
>based sort of approach and, if so, what do they do to provide a
>'development version' of a program in parallel with a working version?
To that last part, I have a personal script "env-dev" (aliased as just
"dev"), here:
https://hg.sr.ht/~cameron-simpson/css/browse/bin/env-dev?rev=tip
Feel free to copy it.
Its purpose is to run the code from the current directory by prefixing
various path environment variables, etc. Additionally it sources the
file ".env.sh" in the current directory or ancestor for customisation
beyond what it does automatically. It also utilises the venv if present.
So to run the test code I go:
$ dev the-programme ...
and it uses the scripts and modules in my development directory.
>I guess virtualenv (Python 2) and venv (Python 3) address this problem
>but they do feel rather more complex than I actually need and I'm not
>very clear how you move code from the virtual environment to 'live'.
The nice thing about a virtualenv is that you can run specific Python
versions with specific modules installed. It is easy to keep a few
around.
You utilise the virtualenv by invoking via the "python" executable
within the virtualenv. That hooks up the virtualenv for the run. (Ignore
"activate", it is a confusing source of pain IMO.)
Moving to "production" is just a matter of maintaining a production
virtualenv, using the python and modules you see fit for production.
For example, I keep a virtualenv in the "venv" subdirectory of the
development tree. I keep a personal, "production", virtualenv in
~/var/venv/3, and ~/var/venv/3/bin is towards the front of my $PATH.
Typically you keep a "requirements.txt" file in your dev tree which
specifies the modules you want. The filename is just a convention. The
to update production you'd just go:
~/var/venv/3/bin/pip install -U -r requirements.txt
where "~/var/venv/3/bin/pip" is _my_ production venv - adjust for your
own, and "requirements.txt" is the reference file you want to use.
>There's also the issue that I'm moving code from Python 2 to Python 3
>so which virtual environment should I use?
Make one of each - that way it is easy to run your tests against either
or both at once. So maybe (in your dev tree) make a "venv2" with a
Python 2 virtualenv and a "venv3" with a Python 3 one, then you can run
python out of each as required.
Also, keep a make target to build the virtualenvs. Here's mine, which
just does one based on "python3".
dev = env-dev -d $. -x
base_python = python3
venv_dir = $./venv
venv_requirements = $./venv-requirements.txt
venv_pip = $(venv_python) -m pip
venv_python = $(venv_dir)/bin/python
_venv:
@[ -d '$(venv_dir)/' ] || set-x mkdir '$(venv_dir)'
[ -x '$(venv_python)' ] || { \
set -xue \
rm -rf '$(venv_dir)' \
$(base_python) -m venv '$(venv_dir)' \
}
$(dev) $(venv_pip) install -U wheel pip
$(dev) $(venv_pip) install -U -r $(venv_requirements)
Cheers,
Cameron Simpson <cs at cskk.id.au>
More information about the Python-list
mailing list