質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

87.49%

PythonのデフォルトをPython3系に変更したい。

解決済

回答 2

投稿 編集

  • 評価
  • クリップ 1
  • VIEW 2,827

score 18

前提・実現したいこと

Dockerファイルをビルドして、Python3を使用できる環境を作成したいです。

>一番知りたいことは、Pythonのデフォルトは何で決定されているかです。

現状

DockerファイルからビルドをしてPython3に変更したPythonを使用したいと思っています。
Python3はインストールされています。以下参照。

root@:~# which python
/usr/bin/python
root@:~# which python3
/usr/bin/python3
root@:~# python --version
Python 2.7.17


https://create-fecundity.com/programming/linux-default-python-version-change/
などからリンカーで

mkdir -p $HOME/bin
ln -s /usr/bin/python3 $HOME/bin/python
n: シンボリックリンク 'python' の作成に失敗しました: ファイルが存在します


n: シンボリックリンク 'python' の作成に失敗しました: ファイルが存在します。
この意味が理解できません。

ここでわからない疑問があります。
>Pythonのデフォルトは何で決定されているのでしょうか??

>n: シンボリックリンク 'python' の作成に失敗しました: ファイルが存在します。ということは、Pythonの動作を決定づけるファイルがあるということでしょうか??(だとするとここをPython3系に変更すればいい?)

Dockerfile部分

FROM ubuntu:18.04

WORKDIR /root

ENV DEBIAN_FRONTEND noninteractive
# sh->bash
RUN mv /bin/sh /bin/sh_tmp && ln -s /bin/bash /bin/sh

# apt-get更新 wget取得
RUN sed -i.bak -e "s%http://archive.ubuntu.com/ubuntu/%http://ftp.iij.ad.jp/pub/linux/ubuntu/archive/%g" /etc/apt/sources.list
RUN apt-get update
RUN apt-get upgrade -y
RUN apt-get install -y wget
RUN apt-get install -y apt-utils
RUN apt-get install -y nano
RUN apt-get install -y less

RUN apt-get install -y vim
RUN apt-get install -y git


#boostの設定
RUN apt-get install -y python3
RUN apt-get install -y build-essential
RUN apt-get install -y python3-dev
RUN apt-get install -y libboost-dev
RUN apt-get install -y libboost-all-dev

# pipのインストール
RUN apt-get install -y python-pip python3-pip

#python3への切り替え ??
RUN mkdir -p $HOME/bin
RUN ln -s /usr/bin/python3 $HOME/bin/python

#必要なモジュールのインストール
RUN pip3 install numpy
RUN pip3 install scipy
RUN pip3 install Cython
RUN pip3 install matplotlib
RUN pip3 install scikit-learn
RUN pip3 install scikit-image

# sh->bashを元に戻す
RUN rm /bin/sh && mv /bin/sh_tmp /bin/sh


Dockerfileには上記で参照した記事のコマンドを設定してみたのですが、Python3に変更はされていませんでした。

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • A_kirisaki

    2020/12/24 11:47

    Dockerfile を全て見せていただけませんか?

    キャンセル

  • I_am_

    2020/12/24 12:04

    dockerfileを追記しました。
    ぜひ、よろしくお願いします。

    キャンセル

回答 2

+2

Ubuntu 18.04 の Python デフォルトは 2.7 です。シンボリックリンクを変えることで 3.x 系にすることもできますが、確実に動作がおかしくなるでしょう。というのもそれまでの Linux というのは古き良き Python 2.x 系に支えられて動いており、これを 3.x 系に置き換えると文法エラーなどで一気に動かなくなるからです。もし 3.x 系を使いたい場合は Python3 として区別するか、デフォルトで 3.x 系の Ubuntu 20.04 を使いましょう。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2020/12/24 12:28

    >ということは、一般的にPythonデフォルトをいじることはしないということですか??
    つまり、pyenvなどを使用するパターンが一般的ということなのでしょうか??

    キャンセル

  • 2020/12/24 12:52

    そうですね。それか Docker ならすでにほしい Python のバージョンが入ってるイメージを持ってくるのが普通かなと思います。公式で出てるので「Python Docker」とかで調べてみると良いでしょう

    キャンセル

  • 2020/12/24 13:07

    ありがとうございます。
    あまりに詰まるようなら、イメージをPullすることも検討してみます。

    キャンセル

checkベストアンサー

+1

Pythonのデフォルトは何で決定されているかです。 

ケース1:
/usr/bin/pythonがpython2の実行モジュールである。

ケース2:
/usr/bin/python2がpython2の実行モジュールであり、
/usr/bin/python/usr/bin/python2のシンボリックリンクである。

シンボリックリンク 'python' の作成に失敗しました: ファイルが存在します。
この意味が理解できません。 

$HOME/bin/pythonがすでに存在するという意味です。あなたが作った物ですが、記憶にないですか?
ls -l $HOME/bin/pythonで確認しましょう。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2020/12/24 12:34

    なるほど、、
    やはり、トラブルの元なのでpyenvを使用するパターンが一般的なのでしょうか??

    キャンセル

  • 2020/12/24 12:39 編集

    > やはり、トラブルの元なのでpyenvを使用するパターンが一般的なのでしょうか??

    「ディレクトリにより異なるバージョンをPythonを使い分けたい」というニーズがないのであれば、入れない方が良いと思います。

    「うっかり標準コマンドと同名ファイルを$HOME/binに作ってしまうのではないか?」という心配をするのであれば、
    これ専用の $HOME/pythonディレクトリを作り $HOME/bin/python を $HOME/python/python に移動し、
    PATHの先頭に$HOME/pythonを、末尾に$HOME/binを設定して、$HOME/pythonには他のファイルを入れないようにすれば良いです。これで、$HOME/bin に何を入れても安心です。

    私は、.bashrc で、
    alias python=python3
    してます。これは、bashプロンプトだけで有効なので、それ以外、例えばシェルスクリプトの中などでは、python3と書く必要があります。

    キャンセル

  • 2020/12/24 13:06

    ひとまずは
    これ専用の $HOME/pythonディレクトリの方法で試します。

    "bashプロンプトだけで有効"ここら辺はまだ勉強不足なので、知識をつけてからどの方法が自分にとって使いやすいか判断して行こうと思います。
    たくさんの知識ありがとうございます。

    キャンセル

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 87.49%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る