it-swarm.com.de

Wie aktualisiere ich Alternativen zu Python 3 ohne apt zu beschädigen?

Neulich habe ich beschlossen, dass der Befehl python standardmäßig python3 statt python2 startet.

Also habe ich das gemacht:

Sudo update-alternatives --install /usr/bin/python python /usr/bin /python2.7 2

Sudo update-alternatives --install /usr/bin/python python /usr/bin/python3.5 3

Sudo update-alternatives --config python

$ Sudo update-alternatives --config python
There are 2 choices for the alternative python (providing /usr/bin/python).

  Selection    Path                Priority   Status
------------------------------------------------------------
* 0            /usr/bin/python3.5   3         auto mode
  1            /usr/bin/python2.7   2         manual mode
  2            /usr/bin/python3.5   3         manual mode

Press <enter> to keep the current choice[*], or type selection number: 0

Und das alles hat funktioniert. Groß! :)

$ python -V
Python 3.5.2

Aber es dauerte nicht lange, bis mir klar wurde, dass ich apt/aptitude beim Installieren und Entfernen von python paketen kaputt gemacht hatte, weil apt python2 erwartete, dass es sich herausstellte.

Das ist, was passiert ist.

$ Sudo apt remove  python-samba
Reading package lists... Done
Building dependency tree       
Reading state information... Done
The following package was automatically installed and is no longer required:
  samba-libs
Use 'Sudo apt autoremove' to remove it.
The following packages will be REMOVED:
  python-samba
0 upgraded, 0 newly installed, 1 to remove and 0 not upgraded.
After this operation, 5,790 kB disk space will be freed.
Do you want to continue? [Y/n] 
(Reading database ... 187285 files and directories currently installed.)
Removing python-samba (2:4.3.11+dfsg-0ubuntu0.16.04.5) ...
  File "/usr/bin/pyclean", line 63
    except (IOError, OSError), e:
                             ^
SyntaxError: invalid syntax
dpkg: error processing package python-samba (--remove):
 subprocess installed pre-removal script returned error exit status 1
Traceback (most recent call last):
  File "/usr/bin/pycompile", line 35, in <module>
    from debpython.version import SUPPORTED, debsorted, vrepr, \
  File "/usr/share/python/debpython/version.py", line 24, in <module>
    from ConfigParser import SafeConfigParser
ImportError: No module named 'ConfigParser'
dpkg: error while cleaning up:
 subprocess installed post-installation script returned error exit status 1
Errors were encountered while processing:
 python-samba
E: Sub-process /usr/bin/dpkg returned an error code (1)

Irgendwann habe ich vermutet, dass python2 als Standard verwendet werden soll, und habe meine Änderungen wie folgt rückgängig gemacht:

$ Sudo update-alternatives --config python
There are 2 choices for the alternative python (providing /usr/bin/python).

  Selection    Path                Priority   Status
------------------------------------------------------------
* 0            /usr/bin/python3.5   3         auto mode
  1            /usr/bin/python2.7   2         manual mode
  2            /usr/bin/python3.5   3         manual mode

Press <enter> to keep the current choice[*], or type selection number: 1

$ python -V
Python 2.7.12

Und dann hat es wieder geklappt

$ Sudo apt remove  python-samba
Reading package lists... Done
Building dependency tree       
Reading state information... Done
The following package was automatically installed and is no longer required:
  samba-libs
Use 'Sudo apt autoremove' to remove it.
The following packages will be REMOVED:
  python-samba
0 upgraded, 0 newly installed, 1 to remove and 0 not upgraded.
1 not fully installed or removed.
After this operation, 5,790 kB disk space will be freed.
Do you want to continue? [Y/n] 
(Reading database ... 187285 files and directories currently installed.)
Removing python-samba (2:4.3.11+dfsg-0ubuntu0.16.04.5) ...

Ich musste es als Standardeinstellung python 2 belassen, aber ich entwickle in python 3 und möchte, dass mein System als Standardeinstellung python 3 für den Fall, dass ich python und idle laufen lasse.

Kann mir jemand sagen, wie ich dies erreichen kann, ohne apt zu brechen?

Mein System ist ein Raspberry Pi 3B mit Ubuntu:

Linux mymachine 4.4.38-v7+ #938 SMP Thu Dec 15 15:22:21 GMT 2016 armv7l armv7l armv7l GNU/Linux

(Es ist eigentlich ein Arm v8)

$ cat /etc/lsb-release 
DISTRIB_ID=Ubuntu
DISTRIB_RELEASE=16.04
DISTRIB_CODENAME=xenial
DISTRIB_DESCRIPTION="Ubuntu 16.04.2 LTS"
12
Will

Gemäß der Debian-Richtlinie bezieht sich python auf Python 2 und python3 Auf Python= 3. Versuchen Sie nicht, etwas zu ändern Dies gilt systemweit, oder Sie haben Probleme, die Sie bereits entdeckt haben.

In virtuellen Umgebungen können Sie eine isolierte Python Installation mit jeder Version von Python= und allen benötigten Bibliotheken ausführen, ohne sich mit dem System herumzuschlagen Python installieren.

In den letzten Python 3 ist venv Teil der Standardbibliothek, in älteren Versionen müssen Sie möglicherweise python3-venv Oder ein ähnliches Paket installieren.

$HOME~$ python --version
Python 2.7.11

$HOME~$ python3 -m venv myenv
... stuff happens ...

$HOME~$ . ./myenv/bin/activate

(myenv) $HOME~$ type python   # "type" is preferred over which; see POSIX
python is /home/you/myenv/bin/python

(myenv) $HOME~$ python --version
Python 3.5.1

Es ist jedoch üblich, für jedes Projekt, an dem Sie arbeiten, eine separate Umgebung zu haben. Wenn Sie möchten, dass dies für Ihr eigenes Login systemweit aussieht, können Sie die Aktivierungszeilengruppe zu Ihrem .profile oder ähnlichem hinzufügen.

10
tripleee

ersetzen

[bash:~] $ Sudo update-alternatives --install /usr/bin/python python \
/usr/bin/python2.7 2

[bash:~] $ Sudo update-alternatives --install /usr/bin/python python \
/usr/bin/python3.5 3

mit

[bash:~] $ Sudo update-alternatives --install /usr/local/bin/python \
/usr/bin/python2.7 2

[bash:~] $ Sudo update-alternatives --install /usr/local/bin/python \
/usr/bin/python3.5

z.B. Installation in /usr/local/bin Anstatt von /usr/bin.

und stellen Sie sicher, dass /usr/local/bin ist vor /usr/bin in PATH.

d.h.

[bash:~] $ echo $PATH
/usr/local/bin:/usr/bin:/bin

Stellen Sie sicher, dass dies immer der Fall ist, indem Sie hinzufügen

export PATH=/usr/local/bin:$PATH

bis zum Ende deines ~/.bashrc Datei. Der Umgebungsvariablen PATH wird ein benutzerdefinierter Bin-Ordner vorangestellt, z. B. /usr/local/bin oder /opt/<some install>/bin wird im Allgemeinen empfohlen, um sicherzustellen, dass Anpassungen vor den Standardsystemanpassungen gefunden werden.

3
jonrobm

Irgendwie ist python 3 zurückgekehrt (nach einigen Updates?) Und verursacht große Probleme mit passenden Updates. Deshalb habe ich mich entschieden, python 3 vollständig aus der Liste zu entfernen Alternativen:

root:~# python -V
Python 3.5.2

root:~# update-alternatives --config python
There are 2 choices for the alternative python (providing /usr/bin/python).

  Selection    Path                Priority   Status
------------------------------------------------------------
* 0            /usr/bin/python3.5   3         auto mode
  1            /usr/bin/python2.7   2         manual mode
  2            /usr/bin/python3.5   3         manual mode


root:~# update-alternatives --remove python /usr/bin/python3.5

root:~# update-alternatives --config python
There is 1 choice for the alternative python (providing /usr/bin/python).

    Selection    Path                Priority   Status
------------------------------------------------------------
  0            /usr/bin/python2.7   2         auto mode
* 1            /usr/bin/python2.7   2         manual mode

Press <enter> to keep the current choice[*], or type selection number: 0


root:~# python -V
Python 2.7.12

root:~# update-alternatives --config python
There is only one alternative in link group python (providing /usr/bin/python): /usr/bin/python2.7
Nothing to configure.
1
Will

Da ich nichts kaputt machen wollte, habe ich dies getan, um neuere Versionen von Python3 als Python v3.4:

$ Sudo update-alternatives --install /usr/local/bin/python3 python3 /usr/bin/python3.6 1
update-alternatives: using /usr/bin/python3.6 to provide /usr/local/bin/python3 (python3) in auto mode
$ Sudo update-alternatives --install /usr/local/bin/python3 python3 /usr/bin/python3.7 2
update-alternatives: using /usr/bin/python3.7 to provide /usr/local/bin/python3 (python3) in auto mode
$ update-alternatives --list python3
/usr/bin/python3.6
/usr/bin/python3.7
$ Sudo update-alternatives --config python3
There are 2 choices for the alternative python3 (providing /usr/local/bin/python3).

  Selection    Path                Priority   Status
------------------------------------------------------------
* 0            /usr/bin/python3.7   2         auto mode
  1            /usr/bin/python3.6   1         manual mode
  2            /usr/bin/python3.7   2         manual mode

Press enter to keep the current choice[*], or type selection number: 1
update-alternatives: using /usr/bin/python3.6 to provide /usr/local/bin/python3 (python3) in manual mode
$ ls -l /usr/local/bin/python3 /etc/alternatives/python3 
lrwxrwxrwx 1 root root 18 2019-05-03 02:59:03 /etc/alternatives/python3 -> /usr/bin/python3.6*
lrwxrwxrwx 1 root root 25 2019-05-03 02:58:53 /usr/local/bin/python3 -> /etc/alternatives/python3*
0
SebMa