The problem is, our code has to run on a customer install regardless of the install. Typically they downloaded Python and installed it themselves on their machine, and more often than not, they have stuff running on their machines and modules installed for their own stuff, and I can’t go about telling them to install some other version and/or force them to use a certain tool to do so: it’s gonna break their own config and it’s going to piss them off.
Our code has to run clean without fuss on Linux and Windows, regardless of what’s installed and how. All we require is any Python version between 3.6 and (now…) 3.12. We tell them they can use another version if they want but then they’re on their own if there are problems. We guarantee proper operation between 3.6 and 3.12. I just had to make sure our installers worked properly and performed a venv install when appropriate (almost required with 3.12 now) and our code ran without warning and without throwing a wobbler because of missing stuff that was there before 3.12 because I don’t want to tell people to spend extra efforts to downgrade and/or mess up their install on Win11.
I’m just now thinking out los here, but would it make sense to use a PowerShell script to silently install miniconda and create a venv with a specific version?
Something like
@echo off
REM Download Miniconda installer (replace URL with the latest version)
powershell -Command "Invoke-WebRequest https://repo.anaconda.com/miniconda/Miniconda3-latest-Windows-x86_64.exe -OutFile miniconda.exe"
REM Install Miniconda silently
start /wait "" miniconda.exe /InstallationType=JustMe /RegisterPython=0 /S /D=%UserProfile%\Miniconda3
REM Create a new environment with the specific Python version
call %UserProfile%\Miniconda3\Scripts\activate.bat
call conda create -y -n py39 python=3.9
REM Optional: Set permissions for multi-user access
icacls %UserProfile%\Miniconda3 /grant:r Users:(OI)(CI)F /T
We wouldn’t do this because we have a policy of modifying as little as humanly possible on the target system, because of the nature of some of our customers: we may not have the right to modify stuff right and left willy-nilly on those customer’s systems, and if we do, we have to justify why with a lot of paperwork. So we don’t: we install our stuff in one very formal, very stable spot of the hard disk (on Windows, c:\Users<username>), install missing modules, stick an icon on the desktop and that’s it.
Historically, we also propose to install Python on the system if it’s missing (used to do that system-wide) and advise our customers to install it system-wide too if they did it themselves so we wouldn’t have to modify our installer (again, if we do, we have to justify the change when the customer is under configuration control, so we try to avoid change). Not anymore obviously.
So yeah, we wouldn’t install Miniconda just for the purpose of not changing our installers. At this point, that’s enough change that I can just rewrite the installers: either way, I’ll have to communicate the change to the customers, so I might as well do it right.
But my point was, if Python gracefully handled backward compatibility - as in, for example, you put in the shebang or near the shebang that you want the interpreter and pip to behave like, say, Python 3.10, and Python4.56 behaves like 3.10 did years later - then this is unnecessary work that I wouldn’t have to do.
I had to rewrite our installers and other things to deal with Python 3.12’s new forcibly-enforced kosher way ot doing things because it won’t do thing any other way and compatibility be damned. That’s my beef with Python: after all this time, it’s still unstable and prone to breaking existing codebases.
It’s a real problem for us and it has been for a long time: code that’s out there and working is liable to quit working when the Python interpreter changes. I have no idea how a 33-year-old language, ultra-widely used language such as Python is allowed to change regularly with little regard to backward compatibility like it was an early beta weekend project. This is truly unprofessional and it completely boggles my mind.
The problem is, our code has to run on a customer install regardless of the install. Typically they downloaded Python and installed it themselves on their machine, and more often than not, they have stuff running on their machines and modules installed for their own stuff, and I can’t go about telling them to install some other version and/or force them to use a certain tool to do so: it’s gonna break their own config and it’s going to piss them off.
Our code has to run clean without fuss on Linux and Windows, regardless of what’s installed and how. All we require is any Python version between 3.6 and (now…) 3.12. We tell them they can use another version if they want but then they’re on their own if there are problems. We guarantee proper operation between 3.6 and 3.12. I just had to make sure our installers worked properly and performed a venv install when appropriate (almost required with 3.12 now) and our code ran without warning and without throwing a wobbler because of missing stuff that was there before 3.12 because I don’t want to tell people to spend extra efforts to downgrade and/or mess up their install on Win11.
Ok. Thank you for the explanation!
I’m just now thinking out los here, but would it make sense to use a PowerShell script to silently install miniconda and create a venv with a specific version?
Something like
More on that here https://docs.anaconda.com/anaconda/install/silent-mode/
Again, this is just an idea, but if this works then you won’t have a problem anymore (maybe?).
Well that’s one solution.
We wouldn’t do this because we have a policy of modifying as little as humanly possible on the target system, because of the nature of some of our customers: we may not have the right to modify stuff right and left willy-nilly on those customer’s systems, and if we do, we have to justify why with a lot of paperwork. So we don’t: we install our stuff in one very formal, very stable spot of the hard disk (on Windows, c:\Users<username>), install missing modules, stick an icon on the desktop and that’s it.
Historically, we also propose to install Python on the system if it’s missing (used to do that system-wide) and advise our customers to install it system-wide too if they did it themselves so we wouldn’t have to modify our installer (again, if we do, we have to justify the change when the customer is under configuration control, so we try to avoid change). Not anymore obviously.
So yeah, we wouldn’t install Miniconda just for the purpose of not changing our installers. At this point, that’s enough change that I can just rewrite the installers: either way, I’ll have to communicate the change to the customers, so I might as well do it right.
But my point was, if Python gracefully handled backward compatibility - as in, for example, you put in the shebang or near the shebang that you want the interpreter and pip to behave like, say, Python 3.10, and Python4.56 behaves like 3.10 did years later - then this is unnecessary work that I wouldn’t have to do.
I had to rewrite our installers and other things to deal with Python 3.12’s new forcibly-enforced kosher way ot doing things because it won’t do thing any other way and compatibility be damned. That’s my beef with Python: after all this time, it’s still unstable and prone to breaking existing codebases.
It’s a real problem for us and it has been for a long time: code that’s out there and working is liable to quit working when the Python interpreter changes. I have no idea how a 33-year-old language, ultra-widely used language such as Python is allowed to change regularly with little regard to backward compatibility like it was an early beta weekend project. This is truly unprofessional and it completely boggles my mind.