

### 知りたいこと

作成したプログラムをある一つのフォルダで完結するようにまとめるにはどのようにしたら良いでしょうか？

### 背景

先日Pythonでスクレイピングを行うコードを作成しました。  
このプログラムをある特定の人にも使ってもらえるようにするにはどのようにしたら良いのかが気になりました。  
ちなみに、不特定多数の人に使ってもらう必要はなく、ある特定の1人に使ってもらうことを想定しております。  
その際に以下の点が気になりました。

  * プログラムでライブラリを使っている際に、そのコードのみを渡してもライブラリをインストールしていないと使用できないため、その人の環境でライブラリをインストールしてもらう必要があるのではないか。

ライブラリも含めてプログラムが一つのフォルダで完結するようにすれば、そのフォルダを渡すだけで使ってもらえると思ったため質問させていただきました。  
恐れ入りますがご教授いただけると幸いです。


CC BY-SA 4.0
2022-10-01T04:47:31.260
91391
2022-10-03T05:35:38.793
54640
question
python
プログラムをパッケージ化する方法


アナコンダがインストールされている前提でなら自分が使用している方法をトレースすることができると思いますので以下に書き残します。  
使えそうならやってみてください。

pyinstallerを使用してコマンドライン（プロンプト）から書き出す場合にファイルがとてつもなく大きくなる傾向があるのでPython仮想環境を用意して、そこでパッケージング処理を行い、exe化する流れになります。

基本的にパッケージングするだけであれば、アナコンダプロンプトなどのコマンドプロンプト画面から

[code]

    pyinstaller c:\******\コンパイルしたいファイル.pyのフルパス --onefile
    
[/code]

でパッケージングできるはずです。このコマンドを入力してしばらくするとpyファイルのフォルダ階層内にdistなどのフォルダ名の構造が生成され、dist内にexeファイルが生成されるはずです。  
このexeは.pyファイルと同じ挙動をするので.pyファイル以外にフォルダ構成などが準備されている必要がある場合は.pyと同じ階層関係に設置してみてください。

で、実行してみて（めちゃくちゃ起動が重いですが）同じ挙動をする場合は以下の手順で軽量なファイルを生成することを推奨します。

同じくコマンドプロンプト画面で

[code]

    cd ******* ←pyと同じディレクトリを入力するか、作業用フォルダを作ってそこを指定しつつ、pyファイルを複製して格納
    conda create -n minimam python=3.8 ←自分の使用しているバージョン数を指定
    y　←※1行目コマンド時、y/nを質問されたらyを入力してenter
    activate minimam
    pip install pyinstaller pypiwin32 ←仮想環境を作成する時にexeファイルをコンパイルするのに絶対に必要になるライブラリをとりあえずインストール
    
[/code]

と1行ずつ入力するかまとめて入力してもらってもいいです。

[code]

    pip install pillow opencv-python　←追加でexeファイルをコンパイルするのに必要なライブラリとして確定でわかっているライブラリがあれば突っ込む（ここで認識できていないライブラリがあってもとりあえずOK）
    pyinstaller .pyファイルのフルパス --onefile --exclude pandas　←exeを実際に生成指示するコード部分。--excludeの部分はexe作るのに除外したいライブラリがある場合に--exclude ●● で連結して1行で記述
    
[/code]

しばらくすると前述のように新しく生成されたフォルダの中にexeファイルが生成されるのでもとのpyファイルと同じファイル構成に設置してみて正常に起動できるか確認する。

ここでエラー（●行目、cv2がインポートされてないから使えないよ、とかの英語記述）が出たらライブラリを追加でインストールしていくのをexeが正常に出力されるまで何回か繰り返すことになると思う。

exeが正常に出力されたら（動作が期待通りになったら）とりあえず相手のパソコン環境に依存しないexeファイルが生成されたことになるのでこれを相手のPCに渡す。exe以外に関連するフォルダやファイルがある場合は階層構造をpyファイルの時と同じようにしてzipにするなりすればいいと思います。

[code]

    conda.bat deactivate
    conda remove -n minimam --all
    y　←※2行目コマンド時、y/nを質問されたらyを入力してenter
    
[/code]

最後にpython仮想環境を削除して完了（今回の例文だと仮想環境名はminimamです）  
一応仮想環境に必要なライブラリだけインストールしてexeファイルをコンパイルすることで8分の1とかかなりサイズダウンします。これやらなかった場合、print('hello')1行のpyファイルですら400MBくらいの巨大なexeファイルが生成されるので注意（とりあえず動くけど）

あと、仮想環境作るのは面倒だからとりあえずコンパイルしてexeが実際に動作するかだけ確認したい場合、以下の書式を.batファイルと拡張子を変更したテキストファイル内にコピペして保存、コンパイルしたいpyファイルを.batファイルへドラッグアンドドロップするとコマンドプロンプト画面が自動で立ち上がって勝手にビルドしてくれる。（前述の大容量化はするのでテスト動作検証程度にしかならないが）

[code]

    pyinstaller %~f1 --onefile　←前述の--excludeを使用してライブラリ除外も可能だが、汎用性を求めると未記述のほうが汎用（激重）
    PAUSE　←実行完了したあと、キー入力があるまでコマンドプロンプト画面を残す場合に記述
    
[/code]


CC BY-SA 4.0
2022-10-03T04:29:20.003
91412
2022-10-03T04:29:20.003
51823
91391
answer


#### Linuxなど最新の UNIX系統の OS

OS自体に Pythonが含まれ, OSの機能の一部として利用されている  
これらの OSでは, OS側の Pythonや パッケージと被ることがないようにしなければならない  
(被ると OSを不安定にさせてしまう, 最悪破壊してしまう)

よく Web記事で見かける pip などは利用を控え(というか使わないようにし)  
pipenv、poetry もしくは [venv](https://docs.python.org/ja/3/library/venv.html)
などを利用する  
(Anaconda の conda でも可)

※  
PyInstallerは Linuxでは使ったことがないので, 正直不明です

#### Windows の場合

PyInstaller以外として …  
[4.4. 埋め込み可能なパッケージ (The embeddable
package)](https://docs.python.org/ja/3/using/windows.html#windows-embeddable)
に記されているパッケージは, サイズもコンパクトです  
ダウンロード: (embeddable package) <https://www.python.org/downloads/windows/>

持ち運ぶのは, このパッケージと(実行する)ユーザースクリプト。  
実行する準備として, パッケージをフォルダーに展開する必要がある (展開した中にも zipがあるがそれは展開不要)  
不必要になれば, そのフォルダーを削除するとよい。


CC BY-SA 4.0
2022-10-03T05:35:38.793
91416
2022-10-03T05:35:38.793
43025
91391
answer