]> ## Python 3 for UNRAID ### General Update Advisory: Backend Version Changes Beware that Python (and "pip") packages are always tied to their respective Python versions. Always read the changelog carefully before updating the plugin (watch out for Python version changes). If the Python version changes between the updates, take note of your installed packages before updating. A convenient way is using "pip freeze" (before) and "pip install" (after) commands to save/restore packages. Packages only need re-install updating to a new major/minor version, e.g. 3.12 to 3.13 (NOT 3.12.1 to 3.12.2). ### 2025.09.30 - fix: disallow install at the same time with iSCSI (also installs Python) ### 2025.08.21 - fix: make pages and dashboards compliant with new responsive UI ### 2025.07.09 - all backends: updated python-pip-24.3.1 to python-pip-25.1.1 - all backends: updated python-setuptools-75.8.0 to python-setuptools-80.9.0 - default backend: updated python3-3.11.11 to python3-3.11.13 (package compatible) - previous backend: updated python3-3.12.8 to python3-3.12.11 (package compatible) - latest backend: updated python3-3.13.1 to python3-3.13.5 (package compatible) ### 2025.02.26 - fix: future-proofing changes to base plugin structure ### 2025.01.09 - all backends: updated python-pip-24.2 to python-pip-24.3.1 - all backends: updated python-setuptools-75.1.0 to python-setuptools-75.8.0 - default backend: updated python3-3.11.10 to python3-3.11.11 (package compatible) - previous backend: updated python3-3.12.7 to python3-3.12.8 (package compatible) - latest backend: updated python3-3.13.0 to python3-3.13.1 (package compatible) ### 2024.10.08 - release note: this update has no backend/version changes for users on the "default" branch (configurable in GUI settings) - new: Python 3.13.x was released as stable and is now available for users on the "latest" branch (configurable in GUI settings) - new: a "previous" backend branch was added for users wishing to remain on Python 3.12.x (configurable in GUI settings) - latest backend: updated to python3-3.13.0 (for OS versions 6.11 to 7.0) - latest backend: this update includes a Python version change, take note of installed packages (see above) - previous backend: updated to python3-3.12.7 (for OS versions 6.11 to 7.0) - previous backend: patch version update is package compatible (when switching branch latest/3.12.6 to previous/3.12.7) - "latest" users wishing to stay on 3.12.x: update plugin, switch branch to "previous", reinstall plugin (packages are preserved) ### 2024.09.19 - new: added a backend branch switch to the GUI offering to choose from different Python versions - new: added a "latest" backend to the GUI for faster-paced, bleeding-edge Python versions (for advanced users) - latest backend: python3-3.12.6 (for OS versions 6.11 to 7.0) - latest backend: python-pip-24.2 (for OS versions 6.11 to 7.0) - latest backend: python-setuptools-75.1.0 (for OS versions 6.11 to 7.0) ### 2024.09.18a - new: added update checking mechanism to GUI - default backend: python3-3.9.10 to python3-3.11.10 (for OS versions 6.11 to 6.13) - default backend: python-pip-21.3.1 to python-pip-24.2 (for OS versions 6.11 to 6.13) - default backend: python-setuptools-57.5.0 to python-setuptools-75.1.0 (for OS versions 6.11 to 6.13) - default backend: this update includes a Python version change, take note of installed packages (see above) ### 2024.09.18 - release note: welcome to the first version of the package killall python-poller >/dev/null 2>&1 if [ -e /boot/config/plugins/iSCSIgui.plg ] || [ -e /boot/config/plugins/iSCSIgui-dev.plg ]; then echo "" echo "--------------------------------------------------------------------------------" echo " INSTALLATION ABORTED" echo " This plugin cannot be installed at the same time with 'iSCSI'." echo "" echo " The reason is that 'iSCSI' installs a conflicting Python version." echo " Please use that plugin's Python installation or uninstall, reboot and retry." echo "" echo "--------------------------------------------------------------------------------" echo "" exit 1 fi if [ ! -e /boot/config/plugins/dwpython.plg ] && type python >/dev/null 2>&1; then echo "" echo "--------------------------------------------------------------------------------" echo " INSTALLATION ABORTED" echo " python is already installed on your system." echo "" echo " A. Another plugin could have installed conflicting packages." echo " Known plugins would be 'Cache Mover' or 'iSCSI', also installing Python." echo "" echo " B. The '/boot/extra' folder could contain conflicting packages." echo " These could be present from previous NerdTools/NerdPack installations." echo "" echo " Please manually resolve any such package conflicts and try again afterwards." echo " You may need to reboot your system for conflicting packages to fully remove." echo "--------------------------------------------------------------------------------" echo "" exit 1 fi if [ ! -e /boot/config/plugins/dwpython.plg ] && type python3 >/dev/null 2>&1; then echo "" echo "--------------------------------------------------------------------------------" echo " INSTALLATION ABORTED" echo " python3 is already installed on your system." echo "" echo " A. Another plugin could have installed conflicting packages." echo " Known plugins would be 'Cache Mover' or 'iSCSI', also installing Python." echo "" echo " B. The '/boot/extra' folder could contain conflicting packages." echo " These could be present from previous NerdTools/NerdPack installations." echo "" echo " Please manually resolve any such package conflicts and try again afterwards." echo " You may need to reboot your system for conflicting packages to fully remove." echo "--------------------------------------------------------------------------------" echo "" exit 1 fi if [ ! -e /boot/config/plugins/dwpython.plg ] && type pip3 >/dev/null 2>&1; then echo "" echo "--------------------------------------------------------------------------------" echo " INSTALLATION ABORTED" echo " pip3 is already installed on your system." echo "" echo " A. Another plugin could have installed conflicting packages." echo " Known plugins would be 'Cache Mover' or 'iSCSI', also installing Python." echo "" echo " B. The '/boot/extra' folder could contain conflicting packages." echo " These could be present from previous NerdTools/NerdPack installations." echo "" echo " Please manually resolve any such package conflicts and try again afterwards." echo "--------------------------------------------------------------------------------" echo "" exit 1 fi echo "" echo "-------------------------------------------------------------" echo " !!! INSTALLING, THIS MAY TAKE A WHILE..." echo " !!! IT IS NORMAL THAT SOME PACKAGES ARE SKIPPED" echo " !!! KEEP THIS WINDOW OPEN UNTIL COMPLETION IS REPORTED" echo "-------------------------------------------------------------" echo "" exit 0 &pkgURL;/python3-3.13.5-x86_64-1dwl_slack15.1.txz cdae1ab49f84baca26c3fa4e5cafd57e &pkgURL;/python-pip-25.1.1-x86_64-1dwl_slack15.1.txz 2ca062b7baa31bc67d49451b340df989 &pkgURL;/python-setuptools-80.9.0-x86_64-1dwl_slack15.1.txz 89ad2fd47c33d8fb1053bdeb7d6068ec &pkgURL;/python3-3.12.11-x86_64-1dwp_slack15.1.txz 3180a9e425b29f6f39b276dbc675025b &pkgURL;/python-pip-25.1.1-x86_64-1dwp_slack15.1.txz 495508b751176e30e671de0597bb230d &pkgURL;/python-setuptools-80.9.0-x86_64-1dwp_slack15.1.txz 655fe58fb7bad7772fe3088f5a934416 &pkgURL;/python3-3.11.13-x86_64-1dw_slack15.1.txz ce7e2a4462159cf4c25f4d798fc8d897 &pkgURL;/python-pip-25.1.1-x86_64-1dw_slack15.1.txz 3631a0d8bf222f735db4a699a6801f6b &pkgURL;/python-setuptools-80.9.0-x86_64-1dw_slack15.1.txz b6f376cf8419528ece65239d8fedfd02 CONFIG=&plgPATH;/&name;.cfg if [ -e "$CONFIG" ]; then source "$CONFIG" if [ "$BACKEND" == "latest" ]; then echo "Installing user-configured LATEST backend for Python3..." upgradepkg --install-new --terse &plgPATH;/python3-3.13.5-x86_64-1dwl_slack15.1.txz upgradepkg --install-new --terse &plgPATH;/python-pip-25.1.1-x86_64-1dwl_slack15.1.txz upgradepkg --install-new --terse &plgPATH;/python-setuptools-80.9.0-x86_64-1dwl_slack15.1.txz elif [ "$BACKEND" == "previous" ]; then echo "Installing user-configured PREVIOUS backend for Python3..." upgradepkg --install-new --terse &plgPATH;/python3-3.12.11-x86_64-1dwp_slack15.1.txz upgradepkg --install-new --terse &plgPATH;/python-pip-25.1.1-x86_64-1dwp_slack15.1.txz upgradepkg --install-new --terse &plgPATH;/python-setuptools-80.9.0-x86_64-1dwp_slack15.1.txz elif [ "$BACKEND" == "default" ]; then echo "Installing DEFAULT backend for Python3..." upgradepkg --install-new --terse &plgPATH;/python3-3.11.13-x86_64-1dw_slack15.1.txz upgradepkg --install-new --terse &plgPATH;/python-pip-25.1.1-x86_64-1dw_slack15.1.txz upgradepkg --install-new --terse &plgPATH;/python-setuptools-80.9.0-x86_64-1dw_slack15.1.txz else echo "Installing DEFAULT backend for Python3..." upgradepkg --install-new --terse &plgPATH;/python3-3.11.13-x86_64-1dw_slack15.1.txz upgradepkg --install-new --terse &plgPATH;/python-pip-25.1.1-x86_64-1dw_slack15.1.txz upgradepkg --install-new --terse &plgPATH;/python-setuptools-80.9.0-x86_64-1dw_slack15.1.txz fi else echo "Installing DEFAULT backend for Python3..." upgradepkg --install-new --terse &plgPATH;/python3-3.11.13-x86_64-1dw_slack15.1.txz upgradepkg --install-new --terse &plgPATH;/python-pip-25.1.1-x86_64-1dw_slack15.1.txz upgradepkg --install-new --terse &plgPATH;/python-setuptools-80.9.0-x86_64-1dw_slack15.1.txz fi echo "" &pkgURL;/python3-3.13.5-x86_64-1dwl_slack15.0.txz a9c45f504d067e38e33f1a4fa955c657 &pkgURL;/python-pip-25.1.1-x86_64-1dwl_slack15.0.txz 45786b1440c06895c9e4c31b7fbafef2 &pkgURL;/python-setuptools-80.9.0-x86_64-1dwl_slack15.0.txz c005ba533cea16eb9bc627b86145b66c &pkgURL;/python3-3.12.11-x86_64-1dwp_slack15.0.txz 20553c14238f2ec0eabee07b387e8136 &pkgURL;/python-pip-25.1.1-x86_64-1dwp_slack15.0.txz 9002e9ec0bc522ef164c77c92f3812cf &pkgURL;/python-setuptools-80.9.0-x86_64-1dwp_slack15.0.txz 06fe633ccda6d32cd2da9364caa508cd &pkgURL;/python3-3.11.13-x86_64-1dw_slack15.0.txz 0d723a5d5cbdc8073f38acd5a01c80a8 &pkgURL;/python-pip-25.1.1-x86_64-1dw_slack15.0.txz 4181ffc6369267186850952c869beb58 &pkgURL;/python-setuptools-80.9.0-x86_64-1dw_slack15.0.txz 1310824864a216db85c54e0bc45319e4 CONFIG=&plgPATH;/&name;.cfg if [ -e "$CONFIG" ]; then source "$CONFIG" if [ "$BACKEND" == "latest" ]; then echo "Installing user-configured LATEST backend for Python3..." upgradepkg --install-new --terse &plgPATH;/python3-3.13.5-x86_64-1dwl_slack15.0.txz upgradepkg --install-new --terse &plgPATH;/python-pip-25.1.1-x86_64-1dwl_slack15.0.txz upgradepkg --install-new --terse &plgPATH;/python-setuptools-80.9.0-x86_64-1dwl_slack15.0.txz elif [ "$BACKEND" == "previous" ]; then echo "Installing user-configured PREVIOUS backend for Python3..." upgradepkg --install-new --terse &plgPATH;/python3-3.12.11-x86_64-1dwp_slack15.0.txz upgradepkg --install-new --terse &plgPATH;/python-pip-25.1.1-x86_64-1dwp_slack15.0.txz upgradepkg --install-new --terse &plgPATH;/python-setuptools-80.9.0-x86_64-1dwp_slack15.0.txz elif [ "$BACKEND" == "default" ]; then echo "Installing DEFAULT backend for Python3..." upgradepkg --install-new --terse &plgPATH;/python3-3.11.13-x86_64-1dw_slack15.0.txz upgradepkg --install-new --terse &plgPATH;/python-pip-25.1.1-x86_64-1dw_slack15.0.txz upgradepkg --install-new --terse &plgPATH;/python-setuptools-80.9.0-x86_64-1dw_slack15.0.txz else echo "Installing DEFAULT backend for Python3..." upgradepkg --install-new --terse &plgPATH;/python3-3.11.13-x86_64-1dw_slack15.0.txz upgradepkg --install-new --terse &plgPATH;/python-pip-25.1.1-x86_64-1dw_slack15.0.txz upgradepkg --install-new --terse &plgPATH;/python-setuptools-80.9.0-x86_64-1dw_slack15.0.txz fi else echo "Installing DEFAULT backend for Python3..." upgradepkg --install-new --terse &plgPATH;/python3-3.11.13-x86_64-1dw_slack15.0.txz upgradepkg --install-new --terse &plgPATH;/python-pip-25.1.1-x86_64-1dw_slack15.0.txz upgradepkg --install-new --terse &plgPATH;/python-setuptools-80.9.0-x86_64-1dw_slack15.0.txz fi echo "" &gitURL;/archive/&plgNAME;.txz &plgMD5; if [ ! -e /tmp/dwpython-autoexec.sh ]; then cp -f /boot/config/plugins/dwpython/scripts/autoexec.sh /tmp/dwpython-autoexec.sh >/dev/null 2>&1 chmod 755 /tmp/dwpython-autoexec.sh >/dev/null 2>&1 if [ -x /tmp/dwpython-autoexec.sh ]; then echo "" echo "Executing 'autoexec.sh' script in background (check SYSLOG)..." (/tmp/dwpython-autoexec.sh 2>&1 | logger -t "dwpython-autoexec") >/dev/null 2>&1 & fi fi echo "" echo "-------------------------------------------------------------" echo " Python 3 for UNRAID has been installed." echo " Version: &version; / Plugin Maintainer: &author;" echo "-------------------------------------------------------------" echo "" killall python-poller >/dev/null 2>&1 echo "" echo "-------------------------------------------------------------" echo " !!! UNINSTALLING, THIS MAY TAKE A WHILE..." echo " !!! IT IS NORMAL THAT SOME PACKAGES ARE NOT FOUND" echo " !!! KEEP THIS WINDOW OPEN UNTIL COMPLETION IS REPORTED" echo "-------------------------------------------------------------" echo "" removepkg --terse &plgPATH;/*.txz rm -rf &plgPATH;/*.txz rm -rf &plgPATH;/scripts rm -rf &emhttp; rm -f /tmp/dwpython-autoexec.sh rm -f /etc/cron.daily/python-poller >/dev/null 2>&1 echo "" echo "-----------------------------------------------------------" echo " Python 3 for UNRAID has been removed." echo " Version: &version; / Plugin Maintainer: &author;" echo "-----------------------------------------------------------" echo ""