This is not just Python - it is the nature of software. Hardware changes more slowly; Software changes and the changes are often pushed down to us, or come along with a change we do ask for:
- the myriad of user installable applications that cannot be tested together
- the languages,
- the myriad of separately sourced, layers of packages that many people think of as “the operating system”,
- the operating system kernels,
The advantages of “open source software” versus a closed shop like Apple operating systems, with the disadvantage of “too many cooks spoil the soup”…(only one “Cook” at Apple these days)
We once lived with software updates on a yearly basis. Now there are nightly updates on every device around us, and every update is a potential for another incompatibility / “issue” that must first be seen by someone that knows how, and to whom, to report an issue.
Additionally, stability and backward-compatibility limited the number and extent of changes allowed with an update. Now with “Continuous Integration” as the software process d’jour that emphasizes the market advantages of “world changing features”, our world is now regularly rocked by “world stopping issues”.
The Python push for virtual environments is a mirror of the business push for “containers” like Java virtual machines and Dockerized applications - they strive to eliminate multi-application interactions, and prevent unauthorized changes. Sounds good to a consumer, but the reality for developers is a nightmare.
In fact, that was my original approach for GoPiGo3 on PiOS Bookworm on Pi5, since the Python GoPiGo3 API was broken but the C++ API appeared to work. Then I found that there is no easygopigo3 in C++, no mutex protected I2C in C++, no 16-tick encoder support in C++, and gee, if I just commented about 10 lines in gopigo3.py I could use Python with no loss of functionality!
There is one more Python “Gotcha” that you have not mentioned - the **GIANT ELEPHANT IN THE ROOM ** - the Global Interpreter Lock. The virtual environment change is nothing compared with the discussions of a Python 3.12 option to disable the GIL.
PEP 703: Making the Global Interpreter Lock Optional (3.12 updates) - PEPs - Discussions on Python.org.
Indeed, “Real ROS Programmers Use C++” but the historical approachability of Python for noobs keeps ROS development in Python a near neck-in-neck option in the ROS community.
I recently complained that, for years, the ROS tutorial code in Python have treated control-c as an unhandled error while the C++ tutorial code cleanly exits. The ROS 2 Jazzy release team started their answer with “That is the nature of Python, but perhaps we should relook at the Python examples to see about that.” Python developers are often “second-class citizens” in the community.
I have to hand it to Dexter for including basic C, Csharp, Go, Java, NodeJS, Scratch, and Python GoPiGo3 API, considering each has a different development model and programming style. As an educational robot, Python has the broadest functionality and most complete set of example programs.
I often wonder what my robots would be if I had chosen the Turtlebot3 instead of the GoPiGo3 in 2016. The GoPiGo3 API was much more approachable than requiring ROS at the time, so I loved doing tiny Python programs that used only the DI API. ROS has always had too-many-cooks, which is harder that I want to understand everything going on in my robot’s brain.
Robots are not easy. Software is not easy. But at least we have an easy place to discuss the difficulties.