🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
Ubuntu

Ubuntuは、Debian GNU/Linuxを基盤としたフリーのオペレーティングシステムです。

Docker

Dockerは、Docker社が開発したオープンソースのコンテナー管理ソフトウェアの1つです

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

解決済

2回答

6940閲覧

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

I_am_

総合スコア23

Ubuntu

Ubuntuは、Debian GNU/Linuxを基盤としたフリーのオペレーティングシステムです。

Docker

Dockerは、Docker社が開発したオープンソースのコンテナー管理ソフトウェアの1つです

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

1クリップ

投稿2020/12/24 02:33

編集2020/12/24 03:01

前提・実現したいこと

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に変更はされていませんでした。

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

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

A_kirisaki

2020/12/24 02:47

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

2020/12/24 03:04

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

回答2

0

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 03:17

A_kirisaki

総合スコア2853

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

I_am_

2020/12/24 03:28

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

2020/12/24 03:52

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

2020/12/24 04:07

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

0

ベストアンサー

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 02:50

otn

総合スコア85893

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

I_am_

2020/12/24 02:59

僕が思っているのは、/usr/bin/pythonにPython3のシンボリックを参照すれば動くと思っています。 それを行ったつもりでした。 root@:/# ls -l $HOME/bin/python lrwxrwxrwx 1 root root 16 12月 24 10:34 /root/bin/python -> /usr/bin/python3 これはシンボリックが参照されているように見えるのですが、間違ってますか?
otn

2020/12/24 03:09

> 僕が思っているのは、/usr/bin/pythonにPython3のシンボリックを参照すれば動くと思っています。 それを行ったつもりでした。 あなたが行ったのは、「$HOME/bin/pythonにPython3のシンボリックを作る」ですね。 > lrwxrwxrwx 1 root root 16 12月 24 10:34 /root/bin/python -> /usr/bin/python3 > これはシンボリックが参照されているように見えるのですが、間違ってますか? はい。合ってます。 あとは、PATHの中の /usr/bin より前に $HOME/bin があればいいです。 なお、/usr/bin/python がpython2である または /usr/bin/pythonへのシンボリックリンクであるというシステムにおいて、/usr/bin/python を python3にしてしまうと、/usr/bin/pythonがpython2であることを前提にしたシステム系ツールが動かなくなる可能性が高いです。
I_am_

2020/12/24 03:24

ありがとうございます!理解しました。 ~./bashrcで一番初めのパスに$HOME/binをエクスポートしたら確かに動作しました。 また、 >/usr/bin/python を python3にしてしまうと、/usr/bin/pythonがpython2であることを前提にしたシステム系ツールが動かなくなる可能性が高いです。 僕は、/usr/bin/python を python3に変更しようと頑張っていたので早めに知れてよかったです。
otn

2020/12/24 03:28

$HOME/bin をPATHの前の方に入れた場合は、標準コマンドと同名のコマンドを$HOME/binに作ってしまうと、標準コマンドでなくそっちが動きます。 今回は意図的に同名ファイルを入れてますが、うっかり意図せず同名ファイルを作ってしまうと、後日、気づきにくいトラブルに見舞われる可能性があります。
I_am_

2020/12/24 03:34

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

2020/12/24 03:55 編集

> やはり、トラブルの元なので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と書く必要があります。
I_am_

2020/12/24 04:06

ひとまずは これ専用の $HOME/pythonディレクトリの方法で試します。 "bashプロンプトだけで有効"ここら辺はまだ勉強不足なので、知識をつけてからどの方法が自分にとって使いやすいか判断して行こうと思います。 たくさんの知識ありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問