web-dev-qa-db-ja.com

aptを壊さずにPython 3に更新する代替方法は?

先日、コマンドpythonをデフォルトでpython2ではなくpython3を起動するようにしたいと思いました。

だから私はこれをやった:

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

そして、それはすべてうまくいきました。すばらしいです! :)

$ python -V
Python 3.5.2

しかし、pythonパッケージのインストールと削除に関してapt/aptitudeが壊れていたことに気付いたのは、そうすぐではありませんでした。

これが起こったことです。

$ 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)

最終的には、python2をデフォルトとして使用する必要があると推測したため、次のように変更を元に戻しました。

$ 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

そして、aptは再び働きました

$ 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) ...

だから、デフォルトとしてpython 2のままにしておかなければならなかったが、私はpython 3で開発しているので、システムをデフォルトでpython 3は、python and idle。

誰もが適切に壊れることなくこれを達成する方法を教えてもらえますか?

私のシステムは、Ubuntuを実行しているRaspberry Pi 3Bです。

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

(実際にはアームv8です)

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

Debianポリシーごとに、pythonはPython 2を参照し、python3はPythonを参照します。3.このシステム全体を変更しようとしないでください。あなたはすでに発見したトラブルの。

仮想環境では、システムPythonインストールを乱すことなく、Pythonの任意のバージョンと必要なライブラリを使用して、孤立したPythonインストールを実行できます。

最近のPython 3では、venvは標準ライブラリの一部です。古いバージョンでは、python3-venvまたは同様のパッケージをインストールする必要があります。

$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

とにかく、作業するプロジェクトごとに個別の環境を用意するのが一般的な方法です。しかし、これを実際に自分のログインに対してシステム全体のように見せたい場合は、アクティベーションスタンザを.profileなどに追加できます。

10
tripleee

取り替える

[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

[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

例えば/usr/local/binの代わりに/usr/binにインストールします。

/usr/local/binがPATHの/usr/binの前にあることを確認してください。

つまり.

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

追加することにより、これが常に当てはまることを確認してください

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

~/.bashrcファイルの最後まで。 PATH環境変数の前に、/usr/local/bin/opt/<some install>/binなどのカスタムbinフォルダーをプレフィックスとして追加することをお勧めします。これにより、カスタマイズがデフォルトのシステムの前に見つかるようになります。

3
jonrobm

どういうわけかpython 3が(更新後?)戻ってきて、aptの更新で大きな問題を引き起こしているので、python 3代替案:

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

何も壊したくないので、Python v3.4よりも新しいバージョンのPython3を使用できるようにするためにこれを行いました。

$ 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