How I think I want to drop modern Python packages into a single program
For reasons beyond the scope of this blog entry, I'm considering augmenting our Python program to log email attachment information for Exim to use oletools to peer inside MS Office files for indications of bad things. Oletools is not packaged by Ubuntu as far as I can see, and in any case it would be an older version, so we would need to add the oletools Python packages ourselves.
The official oletools install instructions talk about using either pip or setup.py. As a general rule, we're very strongly against installing anything system-wide except through Ubuntu's own package management system, and the environment our Python program runs in doesn't really have a home directory to use pip's --user option, so the obvious and simple pip invocations are out. I've used a setup.py approach to install a large Python package into a specific directory hierarchy in the past (Django), and it was a big pain, so I'd like not to do it again.
(Nor do we want to learn about how to build and maintain Python virtual environments, and then convert how we run this Python program to use one.)
After some looking at pip's help output I found the '
--target <directory>' option and tested it a bit. This appears to
do more or less what I want, in that it installs oletools and all
of its dependencies into the target directory. The target directory
is also littered with various metadata, so we probably don't want
to make it where the program's normal source code lives. This means
we'll need to arrange to run the program so that
set to the target directory, but that's a solvable problem.
pip install' invocation does write some additional pip
metadata to your
$HOME. Fortunately it actually does respect the
value of the
$HOME environment variable, so I can point that at
a junk directory and then delete it afterward. Or I can make
point to my target directory so everything is in one place.)
All of this is not quite as neat and simple as dropping an
directory tree in the program's directory, in the way that I could
deal with needing the rarfile module, but then
again oletools has a bunch of dependencies and pip handles them all
for me. I could manually copy them all into place, but that would
actually create a sufficiently cluttered program directory that I
prefer a separate directory even if it needs a
(Some people will say that setting
$PYTHONPATH means that I should
go all the way to a virtual environment, but that would be a lot
more to learn and it would be more opaque. But looking into this
a bit did lead to me learning that Python 3 now has standard
support for virtual environments.)