- 締切済み
python2および3が同居する環境について
Linux(ubuntu, あるはWindows10上のubuntu)ですが、意識しなくてもOSをインストールした時点でpythonが2.7になっていました。そこでanacondaでpython3.xをインストールしました。この時点で両方のpythonがあることになります。また、コマンドとしてはコマンド"python"で2.7, "python3"で3.xが呼び出されるようです。自分としてずっと3.xで行きたいのですが、"python"で2.7というところが嫌だなあと思っています。例えば"pip"で何かをインストールしてみるとどうも2.7の方に対して対応しているようです。”ようです”というところもあやふやなのですが。numpyなどもそうで、python3.xでpip install numpyとやってもimportできないと言ってきます。pipが2.7に対して適用されていると思います。 エイリアスでpython3をpythonとするだけでこのような混乱を避けることができるものでしょうか。 2.7を温存してpython3だけをデフォルトpythonとして使用する方法についてなにかありましたらお願いします。 また、2.7をバッサリ切り捨てる方法を教えて頂ければと思います。実はやったつもりなのですが、できていませんでした。アンインストールが一番クリアな方法にはなります。副作用がなければですが。コマンドとしてはsudo apu delete....とかsudo apt remove とかです。アンインストールの方法もよろしくお願いします。
- みんなの回答 (4)
- 専門家の回答
みんなの回答
- m-take0220
- ベストアンサー率60% (477/782)
> 老婆心ながら逆にpython2.7を呼び出したいときどうするんだろうと思いますが。それは必要に応じてOSが勝手にやってくれるでしょうから私が気にする必要はありませんが。 activateで何が変わるかというと、主に環境変数です。特に、PATHが変わって、OS標準のpythonのパスよりもanacondaのpythonのパスが先に記述されて、そちらが優先的に呼び出されるようになります。 バックグラウンドで実行される場合は、ユーザーが異なるかプロセスが異なることになり、PATHの設定が変更されていないので、pythonコマンドで実行されるのはpython2.7のほうになります。 activateした環境でpython2.7を使いたい場合は、python2コマンドを使うか、deactivateして環境変数を元に戻します。
- cametan_42
- ベストアンサー率62% (162/261)
> そこでどうしても質問が出てくるのですが、自分でコマンドを入力して仕事をするのではなく、ネット等からスクリプトなどをダウンロートして使用する場合、それを作成した人がpython3.xを使うつもりで"python", "python"を連発していた場合、呼び出されるのはその都度、python2.7であることは想像できます。そこには齟齬(スクリプト作成者の意図と私のPCの環境とに)が発生することになります。そういう問題ってないのでしょうか。 ありますね(笑)。間違いなくあります。 もっともpipやpip3で管理されてるスクリプトだとその限りじゃないですが、「野良」の場合はどっちにせよ信頼度は劣ります。 いずれにせよ、こっち側では、事実上、 「Python2 と Python3は全く別のソフトウェアである」 と認識せねばならない、って事です。そしてPython設計/開発者側の思惑と違って、Python2からPython3への「移行」はあまり上手く行ってないのです。 しかもバージョン違いがそのまま「ソフトウェアとしての違い」になってるんですね(後述)。そういう意味だとPythonはバージョンアップが失敗してるのは事実です。 「個人的に」Python2系を消去してPython3系にしたいのはわかりますが、結局、開発者側もPython2系に慣れきってスクリプトを記述してるので(しかもそれが普及してる)、Linuxのシステム周りでもいっこうに3系が普及せず、結果今のような状況になってるのです。 対策: 「今から学ぶなら」Python3だが、システム周りは「2系」に慣れきってる既存の開発者に任せておく。Python3は「普及してるPython(2系)」と「全く別のプログラミング言語」と割り切る事。 ところで、常用するスクリプトとして、はいざ知らず、開発の場合はどうすんのか、と言うと、Pythonは「おかしな逃げ道」を用意してます。 それが「仮想環境」と言われるモノですね。これで「どのPythonを使うのか」逐次指定できる。 「Python 開発 仮想環境」でググればいくらでも情報は見つかるでしょうから、「開発に際して簡単にバージョンを指定したい」場合、仮想環境を用いるのが面倒がないでしょう。 注: 言い方変えると、例えば同じ2系でも2.3と2.6は「同じコードを書いても動かず」、またあるスクリプトをリリースしても、「ユーザーが全員同じ環境を使ってる保証がない」状態で、開発側が「全環境で問題無く動くかどうか」テストせなアカン程「Pythonのバージョンはメンド臭い事になってて」、そのまま今まで来てる、と言う事を表しています。 一例として次のリンクを貼っておきます。 pyenvの使い方とインストール : https://www.python-izm.com/tips/pyenv/ 画像: 例としてこちらが使ってるXubuntuに入ってるPythonを表示したモノ。 この段階で、 ・Python2.7 ・Python3.5 ・Python3.6 ・Python3.7 と実は「4種類も」入ってる。当然自分で入れたわけでもなく(筈?)「所々のスクリプトないしはソフトウェア」が要求したバージョンのPythonが別々にシステムにインストールされてこういう状況になってる。 そして、これが示してる事は「同じ3系のPythonでも」重複しなきゃいけない程、細かいところでは「非互換性がある」と言う事を表していて、Pythonの「バージョンアップデート」と言うのはある意味全く信用出来ない。 なお、pip3で何かインストールする場合、システムが中心的に(Python3系では使用されてる)Python3.6対象になってて、実は最新のPython3.7(あるいは古い3.5)には反映されない、とか言うクソな状況も形作ってもいる。 色々このテのメンド臭い事を避けるには python(バージョン番号) -m pip3 install パッケージ名 として「どのPythonを対象にするのか」小数点以下で明言する。 しかし、この辺の諸々が面倒くさければ、やっぱり仮想環境を構築するのがマシなような気がする。
- cametan_42
- ベストアンサー率62% (162/261)
#1 氏も仰ってる通り、Python2.7はLinuxではシステム周りに使われてる大事な処理系なんで、削除しない方が良いです。削除したらシステムがぶっ壊れる確率が高いんで、おかしな事をするのは止めましょう。 ちなみにPython3でpipを使う場合、pipじゃなくってpip3を使用すれば良いです。
- m-take0220
- ベストアンサー率60% (477/782)
anacondaでインストールしたのであれば、activateを実行すればpythonコマンドでanacondaのpythonが起動されるようになるはずです。 システムに元々入っているpython2.7は、それを前提に作られているコマンドがあるので、削除しないほうがいいです。 ユーザーの環境だけ切り替えるようにすれば、最初にactivateが必要な手間はありますが、他の問題は起こらないはずです。
お礼
回答ありがとうございます。インストールするだけでなくactivateする必要があるということですか。それがなされると、"python"としたらpython2.7ではなく、python3.xが呼び出されるということですね。(老婆心ながら逆にpython2.7を呼び出したいときどうするんだろうと思いますが。それは必要に応じてOSが勝手にやってくれるでしょうから私が気にする必要はありませんが。) 最近のanacondaのインストールはanaconda...shというファイルを入手してbash anaconda....shと入力するらしいですね。これでactivateもしたことになるのかなと思いますが。sudo bash anaconda..shではないところもそんなもんかなと思います。
お礼
回答ありがとうございます。python2.7は温存するとします(実際に消そうとしたのですが消えなかったです。消すだけのテクが無かったのもあると思いますが)。そこでどうしても質問が出てくるのですが、自分でコマンドを入力して仕事をするのではなく、ネット等からスクリプトなどをダウンロートして使用する場合、それを作成した人がpython3.xを使うつもりで"python", "python"を連発していた場合、呼び出されるのはその都度、python2.7であることは想像できます。そこには齟齬(スクリプト作成者の意図と私のPCの環境とに)が発生することになります。そういう問題ってないのでしょうか。それともpython3.xを利用する人は”python”ではなく、かならず”python3”を明示するようになっているのでしょうか。”pip”ではなく”pip3”を使えばよいということですが。自分自身がキー入力するときのことですね。 あるいは、例えば、”python”と入力すればpython3.xを呼び出すようにエイリアスしておけばいいということはあるのでしょうか。そうすると"python"というスクリプトとか入力はすべてpython3.xと解釈されるということになるのかなと思いますが。違うでしょうか。