I wanted to start contributing to an open source software project yesterday evening, and they recommend virtual box to not mess with your default installation of the program and the databases it uses.
So I thought Debian would be a nice clean distro for developing Python… Gnome feels really unusual to me and I hate it, I guess I can replace it with KDE.
But I couldn’t install a specific Python version? System python is 3.13 but I needed 3.10. I tried adding the deadsnake ppa but Debian didn’t know the add-apt-repository command. So I tried to install software-properties-common which also failed because the package couldn’t be located. Someone on SO said it was removed because security but I mean wtf? So the solution is to add this package cgabbelt manually to sources.list but I couldn’t get it to run because I couldn’t verify the GPG key… Then I went to sleep.
I am pretty sure this community can help with the problem, but honestly, wtf? I am not a Linux power user but a data scientist who works on Linux for a couple of years now, how is it possible installing a specific Python version is such a hassle?
Is Debian just a poor choice for developing? The software I want to contribute to has many dependencies, they recommend Ubuntu but fuck Ubuntu. So I guess I can’t take something too exotic.
I like to use pythonz in this case; it’s a tool to manage Python installs, and it puts the installs in a directory under your home directory, not affecting anything in the system.
It does build each version from source, which introduces some quirks; I’ve found compilation for some Python versions works better with clang, and sometimes, you need to enable build options.
Still, I think this is a good way to do things; just start whichever Python version you want, and then create a venv with it.
other commenters have hinted at this, but the main point of most of the good advice is this: don’t use the system Python install (ie the one from
apt) for development.uvis my go to, but the idea behind,pyenv,asdf, etc is the same. the underlying OS shouldn’t be an issue; you should be able to ship the code between OSs and build just fine, ideally.But I couldn’t install a specific Python version? System python is 3.13 but I needed 3.10.
The others have covered virtual environments, which is what you need if you really want a 3.10 interpreter.
But… the thing I’m here to tell you is:
they recommend virtual box to not mess with your default installation of the program and the databases it uses.
for many projects this doesn’t actually matter. You can just ignore the warnings, use the most recent version and install whatever you need.
You’re already sandboxing this stuff in a virtual box, which you should be able to reset or bootstrap again when you need to. You’re not interfering with your actual systems’ python, you’re messing with your virtual box’s system python.
I find the whole venv stuff to be very annoying, I never need it, because I use libraries that don’t interfere with system operations and I don’t downgrade to interact with projects. And even if you’re not installing “correct” versions, most of the time newer versions fix bugs and expand functionality. It is extremely rare that functions get removed and it will actually break by you not using their exact version. Or like, version conflicts.
And besides, they would need some kind of CI / testing that would check for compatibility anyway.
tldr: ignore venvs, try it bare metal, see if something breaks. If not, there you go, if yes, you can still invest the time and effort of learning venvs.
As others have said [uv] (https://github.com/astral-sh/uv) is likely a good option but since you’ve mentioned being a data scientist you might also check out [pixi] (https://prefix.dev/tools/pixi).
It’s built on top of conda so will likely have all the packages you might need.
It’s got quite a nice workflow, keeps things contained in the project directory, and adds a few conveniences over standard conda.
use something like uv to install whatever python version you want and set up a venv with it. that way you can have project-specific python versions.
Seconding uv and adding docker-compose for running dev DBs/services as my recommendation
… and adding docker-compose for running dev DBs/services …
If you’re into that sort of setup, you might appreciate testcontainers.
Now I found a use case for UV! I am a long time
venvuser and was always struggling to understand why I should add another complex layer of software into my pipeline. Also when I last tried UV, the recommended way to install it was piping arbitrary code from curl into bash, but maybe that has changed. I have a look, thanks!That is a good solution to my problem - but what is the problem with Debian? Am I too old, and is it a bad idea to install a specific Python installation directly into the system?
i mean python is 99% backwards compatible so as long as you tell your tooling you’re working with 3.10 it will warn you about using stuff that’s too new. that’s why the shipping version is usually enough. in general it’s not recommended to have multiple versions of python3 installed at the same time, but if you are a habitual venv user it’s usually not a problem. however i have also run into the issue of some versions being “too new” for a project, where the thing just would not work with newer versions.
basically, if your issue is only that you don’t want to “contaminate” an older codebase, that can be solved by configuring your tooling. but if your issue is that the thing just doesn’t work with the “wrong” version, you’re probably best of using a container. a user installation of the version you want will work but having multiple installations is annoying.
It’s not so much about Python itself but the libraries it uses. I experienced very often that the module maintainers for specific libraries require time to port to a newer Python version, and if it only means testing it against it. This is why I have the habit of staying on “2 version older” than the current release. As a data scientist this always made sense for me, I cannot count the times an environment broke because there was a conflict with the Python version. I guess you are right and it probably runs fine. I just wanted to set up my development environment right the first time to save some struggle later. Thanks for your input.
Here’s my 2¢. Debian is a reasonable OS to develop on, since it provides a super stable and reasonably secure base platform. I’ve used it quite extensively for the same purpose without any issues whatsoever.
However, it won’t satisfy the needs of the modern style of development. For that, you need a reproducible development environment so that every developer gets the same results. (That means avoiding the ‘it works for me’ type of bugs). That means you need the same version of runtimes (python), same version of libraries/dependencies and same developer tools on every development system, irrespective of the distro it’s running on.
The problem with Debian is that it often ships older versions of software to keep it stable. It will likely not match the version of python and tools you need. For that matter, no distributions including the frequently updated Arch Linux are likely to meet those requirements. (There are exceptions - NixOS and Guix.) So the widely adopted solution is to create a dev environment independent of your core system, from your regular non-root account. That means separately installing a python runtime that’s different from your distro repo, etc. They don’t touch your core system and keep it clean and pristine.
The way we achieve this is by using 4 tools:
- Runtime version manager: Manages the version of runtimes.
- Eg: python: pyenv, node: nvm, rust toolchains: rustup
- Environment manager: Creates and maintains isolated environments where the correct runtimes, project dependencies and tools are available.
- Eg: python: venv, node: node project, rust: rust project
- Dependency manager: Resolves and installs the correct version of all project dependencies into the environment.
- Eg: python: pip, node: npm, pnpm, rust: cargo add
- Tool manager: Installs additional development tools for the project, like formatter, linter, etc.
- Eg: python: pip, pipx, node: npx, rust: cargo install
Often, many of these are combined and you may get less than 4 different tools. The current situation is extremely complicated and there are many different tool combinations you can use. So let’s address your specific requirements.
If your project uses only Python
In this case, the choice is pretty straightforward. Use
uv.The package management situation in the Python ecosystem was an absolute mess until UV appeared on the scene. UV combines all the 4 functions I mentioned above. It replaces venv, pyenv, pip and pipx in a single fast binary. You’ll be surprised by its speed if you’re used to the speed of pip. It’s easy to use and very well integrated. It also integrates additional functionalities like:
- Formatter (replaces black)
- Project setup (helps with poetry, flit, hatch, etc)
- Project publishing (replaces twine)
If you will use more than Python
If you will use tools or languages other than Python in a single project or in other future projects, you might want to use a ‘language-agnostic runtime and tool manager’. They can manage runtimes and tools of multiple languages. Dependencies have to be managed using language package managers (like UV, pip, cargo, npm, etc).
The most well known tool manager is
asdf. Others includeaqua,vfox, etc. But the upcoming star ismise. I use mise for multiple projects including for Python projects. Mise uses UV behind the scenes for Python. So, mise projects play well with UV projects and with others who use UV.The only disadvantage with multitool managers like asdf and mise is that they tend to be more complex compared to single language tools like UV. They obviously handle more and provide more features. However, investing time in tools like mise pays in the long run when you’re handling multiple languages.
Servers like databases
The tools I mentioned above don’t handle daemons like postgresql, redis, etc. This is why your colleagues recommend VMs. I will talk about VMs in a while. But I want to show you some simpler solutions here.
Another commenter has already mentioned the use of docker-compose files to set up such servers. It’s the easiest solution possible.
Another more refined solution specifically for development containers is
testcontainers. It’s essentially the same as the docker compose solution, but with more dials and switches to help with automated tests like unit tests during CI. You’ll have to learn a bit more than docker compose, to use it. However, those test servers are also readily available online and require little configuration.Do you need virtualbox?
The methods explained above don’t ruin your base Debian install. So a dedicated VM is not really required. However, I’m leaving this information here for completeness.
Use of VMs was widespread in the past. But they didn’t run virtualbox, VMware or Qemu directly. Instead, a CLI frontend tool was used to set up those VMs for development. The most common tool was Hashicorp’s
Vagrant. Another tool available today isLima. These tools mount your project directory into the VM, set up its network, install required tools, start required services (like DBs), attach a shell for you to work on, etc. These VMs are complete development environments and you don’t need to do anything on the host system other than starting them up.Since the advent of containers, the same idea has been implemented using containers instead of VMs. These are obviously less resource intensive than VMs. Most of them follow the devcontainers standard. So a devcontainer configuration works on multiple platforms, including GitHub’s famous codespaces. Local tools for it include devpod, ona, devbox and devenv.
Conclusion
There are a lot more solutions. But these are the ones you’re most likely to settle on. So I leave it at that. Please let me know if you have any questions about this reply. Hope you find your favorite setup soon.
Thanks so much for your efforts writing this up. I will study it and come back if I have any doubts.
The reason I use VirtualBox is simply, that it is the recommendation in the developers guidelines of the project, which is gramps by the way.
I have basic experience with Docker, I managed to build a container that runs with alls dependencies based on alpine, then it struck me - I don’t have a GUI in my container which I need of course to run my IDE and the software itself. I read about X11 forwarding but then wasn’t sure if that is the right way. I am pretty sure one can isolate some things using
docker-compose, but it can be frustrating if you want to get into the project codebase and then have to do so much infrastructure stuff.I guess it is a combination of lack of skills (I derive data from data for my job, ML etc.) and the project itself using outdated methods because of historical development.
But as I said, I need to do my research. Thanks again for your friendly way of explaining things, much appreciated.
The reason I use VirtualBox is simply, that it is the recommendation in the developers guidelines of the project
That’s a perfectly reasonable requirement. The problem here is that solution space is like the JavaScript ecosystem. There are more solutions than you can count and no two developers ever agree on everything. Everyone eventually settles down on one solution or the other based on their personal preferences. That’s why I thought it was important to give you an overview rather than a definite solution.
I just want to add that VirtualBox is a backend to ‘Vagrant’. Developers usually depend on Vagrant, rather than fiddle with VirtualBox directly. Vagrant takes care of some low-level VM configuration on its own and consistently recreates the VM every time with little fuss. You will need a configuration file for the VM (Vagrantfile), either readily available or newly written. I recommend Vagrant rather than direct vbox due to its convenience. However, I’m not pushing it further since I can’t judge your options better than you.
I am pretty sure one can isolate some things using
docker-compose, but it can be frustrating if you want to get into the project codebase and then have to do so much infrastructure stuff.Certainly! That’s what tools like vagrant are meant for. The only problem is that it replaces tediousness with choice fatigue!
I don’t have a GUI in my container which I need of course to run my IDE and the software itself.
This is where the convenience of tools like VM, devpod, etc shines. However, you can also implement this solution manually with VMs or Docker. It’s simple - bind mount the source directory on host into the VM/container. Then you can edit it using devtools and IDE from both the host and the VM. Tools like vagrant and devpod manages this for you.
However, the situation gets a bit tricky when you want to use GUI applications inside the VM/container. That involves mounting the X11/Wayland socket from the host into the VM/Container, doing the correct UID/GID mapping and setting the correct file permissions. Developers usually don’t do this manually since it’s tedious. However, some tools manage that too. I don’t remember which one, off hand.
Thanks again for your friendly way of explaining things, much appreciated.
Glad I can help! Take your time - there are a lot of tools to explore, unless you’re on a mission. Good luck!
Especially on Debian, I would not be messing with the base / host system so much. This is why a VM is being recommended.
My solution would be to use Distrobox to run another Linux distro in a container. This could a distro that defaults to a version of Python you need like Arch, Fedora, or Ubuntu.
This is a good idea even if you use something else to get the Python version you want. Especially so.
The big advances of this solution are that you get native performance, can see all your normal files, and have an environment that you can customize that does not mess up your host system. You can have other Distroboxes with other tools. You can delete your environment and start over.
@LeFantome @gigachad This is a good idea if you have more SSD and RAM than you know what to do with.
Why not use Miniconda or a similar virtual environment solution? I never ever ever work with the system Python. I always pick my Python version and packages per-project to work best with the other dependencies.
Gnome feels really unusual to me and I hate it, I guess I can replace it with KDE.
Yeah I use Debian with KDE on all my systems. Shit’s cash 😎
Also unrelated, but you ought to bookmark the following article that shows you how to use Jupyter in a multi-environment setup:
https://bitsofanalytics.org/posts/jupyter-conda-envs/jupyter_conda_envs
I just despise conda, I think it is bloat :D but thanks for the advice
I mean Python is bloat 😆
You’ll run into that on many distros,
not only Debian, since most of the distros use a specific python version for OS packages, its recommended to leave the python for your OS unchanged.But VirtualBox is not a good idea either.
Instead use a venv (virtual environment),
which is the python way to develop/run under different python versions.I always do ‘python3 -m venv venv’
Then activate. Then your usually good.
But VirtualBox is not a good idea either.
Maybe not for Python, but if the database project they’re contributing to relies heavily on modified system libraries, it can be useful to isolate those from your host. Using either a VM or a container can do that.
I know
venvpretty well, but it does not do it for this project. It’s not about isolating the Python libraries, but the system libraries and more importantly the databases the program itself creates. Also I would never install packages into a Python system installation.As @[email protected] already mentioned: Download the python 3.10 source tarball from python.org, unpack, compile and install it. Then run the python3.10 binary with the venv option in the path where you want your venv to be created. By this, the created venv is configured to use the desired (3.10) version of python, not your system’s default version.
If you’re gonna compile python, I’d suggest using pyenv to automate the process and provide stubs.
Python is a clusterfuck because so many operating systems rely on it generally, so they may require a version minimum.
Which version of Debian are you trying to do this with and what version of python?
I have a repo (why-py3) where I’ve cobtainerized python of various versions with various versions of Debian for “questionable reasons”
Debian is a great choice for developing, it’s rock solid and stable BUT if you want to be working with bleeding edge packages you may need to use the rolling release Debian which is less stable.
Or fedora might be more your speed as it has newer packages typically.
@prettybunnys @gigachad Debian actively prevents you from changing their version to stop you from messing up the system. Consider Pipx or UV to use and install wherever other things you wanted to that way and you won’t have a problem…
I’m not talking about removing the system python but rather compiling everything necessary to build a package for differing versions / distros then executing that version and some tools linking that version. It’s dumb, but I needed it when I needed it.
My use case is/was extremely NICHE but I may be able to provide some help if they really need to go this route.
In addition to others’ answers here, I suggest reading over this document whenever you get frustrated by Debian: Don’t Beak Debian
Debian has a particular philosophy for its design choices. Using non-standard sources.list entries, for instance, can break your system in the future. You’ll have a much better time in the long run if you come to understand why Debian is the way it is
You want to look into
uv, it can set you up a specific python version fairly easily.I’ve successfully used pyenv in the past, although
uvclaims that it includes allpyenvfunctions and more.…although
uvclaims that it includes allpyenvfunctions and more.It does. I have used both. UV is the first python development/packaging tool that seems to satisfy Python developers.
I install python into my user directory on debian and it works great. But if you need to run a particular version of python as root I’d go the container (podman/docker/etc) instead of virtualbox. Massive performance benefit over vbox as containers share your host OS kernel and generally integrates better into tooling. You just specify an image by name like 3.13-bookworm and you get a container with python 3.13 on a debian bookworm equivalent userland
What is this project, and why does it require specific Python 3?
It requires Python > 3.10, but it is not tested very well and I don’t want to provoke incompatibilities. There is no need to run Python 3.13.
If it were me I’d just follow the instructions with python 3.13. You’re very unlikely to run into any problems, and you save yourself this hassle.










