Python環境構築
Pythonの「仮想環境」を完全に理解しよう
Pythonのパッケージ管理の中級者の壁を超える stapy#98
Rye & uv 追っかけ
Pythonのおすすめ開発環境2022
Anacondaいらなくなってきてるのええなあ
conda vs pipに溶かされた時間・・・
Pythonの実行環境
pipとpipenvとpoetryの技術的・歴史的背景とその展望
2年間の棚卸として、僕が、写経・独学してきた書籍とKaggleの取り組みを紹介したいと思います☺️
3年前のメモなので、古いです
Macの中のソフトウェアのインストールがhomebrew、pythonの中のライブラリのインストールがpip
真面目に開発環境を用意する場合はdockerを使うべき
ライブラリの確認方法
1:Importで検索して確認(バージョンはわからない)
2:検索して確認
Python -m ライブラリ名 —version
3:一覧から探す
Conda list
Conda list -n 環境名
環境名を書いて実行すると、指定した環境にインストールされているライブラリが出力される
使いたいライブラリと対応するpythonのバージョンを確認
conda search ライブラリ名
conda create -n 環境名で仮想環境を作れる
pythonをバージョンを指定しないと、condaに対応している中で最新のバージョンがインストールされる
anacondaにインストールされている全てのライブラリを仮想環境にインストールする方法もある
condaが対応していないライブラリをインストールする時は3つの手順があり
1.パッケージ名を決定する
2.インストールしたいパッケージ名のURLを調べる
3.インストールする
という手順がある
PythonにはPEP(Python Enhancement Proposal)というものがあり、Pythonの言語仕様、実装の変更、3rd partyなどで提案されてから広く受け入れられた機能などを標準に取り込むための提案はPEPの形式で提出され、PEP Editorsに承認されたものが標準に取り込まれる。
パッケージングツール:setuptools、wheels
パッケージインストーラ:easy_insall, pip
condaはパッケージインストーラであると同時に、パッケージングツールでもあり、condaでは全く独自のパッケージング方法とホスティング方法を使ってパッケージを配布、インストールしている。これはwheelとは互換性はない。
anacondaを機械学習の環境に推奨しない人もいる
・サイズが重すぎる
・依存関係がわからなくなる
anacondaは全部入りの環境なのでアプリ開発を行ったときにどのライブラリに依存しているのかわからなくなる
minicondaでも定期的にconda clean --allで使っていないパッケージを削除しないと軽く数G持っていかれるので注意が必要
仮想環境の有効化を行う際にコマンドのバッティングが発生し、シェルがハングするためminicondaを利用する場合はpyenvは導入しないほうが良い
Pythonでの開発の流れ
1:プロジェクト用の仮想環境を作成する
2:仮想環境に必要なモジュールをインポートする
3:Pythonプログラムの作成、実行を行う
# 1. 仮想環境を作成(virtualenv的なもの)
conda create -n my_env numpy scipy
## 仮想環境の一覧を表示
conda info -e
# 2. 仮想環境を有効化
activate my_env # Windows
source activate my_env # Max/Linux
## 仮想環境に追加でインストール(バージョンを指定する場合conda install scipy=0.12.0など)
conda install scikit-learn
## condaで取得できないものについて、pipでインストール(仮想環境にpipを入れて対応)
conda install pip
pip install Flask
## インストールしたパッケージのアップデート(conda自身はconda update conda)
conda update numpy
# 3. condaで構築した環境を書き出し/読み込み
conda env export > environment.yml
conda env create -f environment.yml
# 4. 仮想環境無効化
deactivate # Windows
source deactivate # Max/Linux
gitによる管理について
バージョン管理の対象として外しておくべきなのが、上記の仮想環境のフォルダと.pycファイルである。
.pycファイルは実行を高速化するためのファイルで一旦実行すると1ファイルにつき1つずつできていく。これをバージョン管理に入れてしまうとファイルが二倍になってしまう。
Python2ではファイルの先頭にエンコードを宣言する必要がある
pep8と合わせ、論理的なチェック飲みにとどめたい場合はpep8のチェックを行うpycodestyleと論理チェックを行うpyflakesがパックになったflake8を推奨する。
そのため、まずはflake8、その後コーディング規約をより高度にする必要に迫られた場合にPylintへ移行するというパスを推奨する。
単体テストとは、プログラムを構成する比較的小さな単位がここの機能を正しく果たしているかどうかを検証するテストである。
単体テストは、プログラム全体ではなく、プログラムを構成するモジュールを個別にテストするために、テスト対象のコードの他に、ドライバーやスタブといった付加的なコードが必要になる場合がある。
ユニットテストフレームワークが標準搭載
Pythonにはunittestが標準搭載されているため、単体テストをするためにパッケージを追加する必要はない。
python2では文字列に通常の文字列とユニコード文字列がある。また、python2では割り算の結果がfloat型にならない。
python3では四捨五入のしようが銀行丸め。偶数に近い方に寄せられる。python2では新スタイルクラスと旧スタイルクラスがある。
継承は可能だが、下位クラスに実装を強制するような仕組みはない。ただ、python2.6からはabcが標準で追加され、擬似的に抽象クラスを実装できるようになった。
また、registerを使うことであるクラスを自分のサブクラスに登録できる。
Pythonは数少ない多重継承をサポートしている言語である。
コンストラクタと思われるものが2つある
Pythonには__new__と__init__という、コンストラクタっぽい関数が2つある。基本的には__init__を使用する。__init__はインスタンスが作成された後の初期化処理であり、厳密にはコンストラクタではない。
クラスに隠し属性が存在する
Pythonのインスタンスには__init__のようにアンダースコア2つで囲われている隠し属性が存在する。
これらはメタ情報を格納したり基本的な操作の実行に使われている。
privateやprotectedがない
ないが、privateなものは先頭に__か_をつけるという慣習がある。継承クラスにだけ見せたいなど、いわゆるprotectedに相当する概念はない。__と_では外部から隠蔽される度合いが変わってくる。
const/finalがない
Pythonでは定数を定義することができないが、タプルは変更不可能なリストなので、これを利用すれば擬似的に定数を作成することは可能
メソッドの第一引数が予約されている
ここでいうメソッドはクラス内の関数である。メソッドの最初の引数は、普通のメンバメソッドはself、クラスメソッドの場合はclsで予約されている。
同クラス内のメンバ関数はself.get_num()のように暗黙の第一引数であるselfやclsを利用して呼び出しを行う
リストとタプル
Pythonには変更できないリストであるタプルが存在する
タプルはその特性上ディクショナリのキーになることも可能である。*と**は任意個数の引数を表し、*はタプル、**はディクショナリにまとめられる。
そして呼び出し側で*、**を使うと逆にリスト・タプルの値を展開して引数として渡すことができる。
デフォルト引数はimmutableである必要がある
からの配列はmutableなので注意する必要がある。immutableでない場合はグローバル変数と同じような働きをしてしまう。
メソッドをオーバーロードができない
Pythonでは引数を変えて同盟で定義するオーバーロードが使用できない。そのためオーバーロードを使用したい場合は、デフォルト引数を使用したり内部で引数の型を判定するなどして1メソッド内の分岐で対応する必要がある。
演算子による計算を実装可能
オペレーターオーバーロード
型定義を記述できる
Python3より引数や関数の返り値について型を書くことができるようになった(type annotation)
これは実行時にエラーを出すわけではないが、事前にこの情報を使ってチェックをかけることもできる。
デコレータ
デコレータとはある関数を修飾するための関数とその仕組みである。
デコレーターを利用することで、既存関数の処理の前後に自分自身で処理を付け加えることができる。
名称空間とimportについてPythonではNamespaceやpackageの宣言をしなくても名称空間がファイルごとに自動的に切られるようになっている。
ファイルごとに切られた名称空間の名前はファイル名と同義になる。ファイル名とパッケージ名がバッティングするときは注意が必要。
from packageで読み込まれるのはフォルダ内の__init__.pyであるので、ここにimport文があればファイルをインポートしたのと同じになる。
相互参照しているファイルのimportの場合はデッドロックになりインポートできなくなるので、ファイル先頭でなく必要な処理内でimportするなどの工夫が必要になる。
あらゆるファイルをスクリプトとして実行可能
if__name__==“__main__”はスクリプトとして実行された際の処理を記載できる
配列内で処理を記載できる
匿名関数の作成
Pythonではlambdaを使用することで匿名関数を作成できる
Pythonにはswitch文がないためif-elseで代用する
非同期処理を実装するためのシンタックスがある
ある連続した処理を複数プロセスで処理する場合のasync/awaitを使ってかける
pipの環境はpip freezeを使った環境の保存と再構築の方法がある。ここではanacondaによる環境のセーブとストアについて説明する。
1、condaを使った方法
保存
conda list --explicit > env_name.txt
再構築(新規の環境を作る場合)
conda create -n env_name —file env_name.txt 再構築(既存の環境に足す場合)
conda install —name env_name —file env_name.txt 公式マニュアルによるとこの方法はエクスポートしたマシンと同じOS・アーキテクチャのマシンの移行に使う使う必要があるので、OS、アーキテクチャに注意
2、conda envを使った方法
保存
conda env export -n env_name > env_name.yml 再構築
conda env create -f=env_name.yml
これはアーキテクチャに依存しない
———————————————————————————————
「MacのPython開発環境を見直してみたらいろいろ大変だったのでメモ」
homebrewとanacondaの相性は最悪
conda envは仮想環境の共有やリモート管理が考慮されておらず不便
Pythonのパッケージマネージャへの要件
1 環境構築が簡単
2 仮想環境が容易に構築できる
3 複数のバージョンのパッケージを管理可能
4 パッケージ情報を簡単に共有できる
5 仮想環境情報をGitなどで管理可能
6 AnacondaというPythonディトリビューションの便利さは捨てたくない

pipenv + pyenvで行こう
「MacでPythonを使って機械学習を学ぶための環境構築」
macの中のソフトウェアのインストールがbrew、python3で使用するためのソフトウェアのインストールがpip3
「PythonのIDEでおすすめのものは?」
Pycharm
PyScripter
Atom
VSCode
Sublime Text
Jupyte notebook
Pycharm
もうVSCodeでええやんけ
「仮想環境」
やはり公式を見るべし
「Pythonプロジェクト開発ツールデファクトスタンダード」
Pythonでゼロからでもサービス開発・公開できる学習ロードマップ
環境の図
【11万文字越え】プログラミング初心者に贈る即戦力ガイド
【2024/02/19】【ランチタイム勉強会】Pythonの開発環境の基本をおさえよう
https://www.youtube.com/watch?v=yjjYg6zCCwc
2024年版Pythonプロジェクト管理はuv、LinterはRuffを導入して開発体験を高める Pythonの仮想環境venvをちゃんと理解する
Rye & uv 追っかけ
uvだけでPythonプロジェクトを管理する
Rye × uvでPython環境と機械学習環境を整える