「Pythonアプリケーションを起動する」の版間の差分

提供: tknotebook
移動: 案内、 検索
(→‎2. ディレクトリを指定して起動する)
(→‎注意)
 
(1人の利用者による、間の39版が非表示)
22行: 22行:
 
=== 注意 ===
 
=== 注意 ===
  
−
sys.path にはモジュールやパッケージのトップディレクトリが追加されないとモジュールやパッケージの検索がおかしくなります。
+
sys.path にはアプリケーションのモジュールやパッケージのトップディレクトリが追加されないとモジュールやパッケージの検索がおかしくなります。
 
<pythonスクリプトファイルのパス> のディレクトリにはモジュールやパッケージのトップディレクトリを指定しましょう。
 
<pythonスクリプトファイルのパス> のディレクトリにはモジュールやパッケージのトップディレクトリを指定しましょう。
  
42行: 42行:
 
=== 注意 ===
 
=== 注意 ===
  
−
sys.path にはモジュールやパッケージのトップディレクトリが追加されないとモジュールやパッケージの検索がおかしくなります。
+
sys.path にはアプリケーションのモジュールやパッケージのトップディレクトリが追加されないと
 +
モジュールやパッケージの検索がおかしくなります。
 
<ディレクトリのパス>にはモジュールやパッケージのトップディレクトリを指定しましょう。
 
<ディレクトリのパス>にはモジュールやパッケージのトップディレクトリを指定しましょう。
  
−
==3. zipファイル内のファイルから起動する==
+
==zipファイル内のファイルから起動する==
  
−
python は java の jarファイル からの起動に似たやり方で zipで固められたアプリを起動できます。
+
python はzipで固められたアプリを起動できます。
 +
やり方は簡単で、zipファイルをディレクトリであるかのようにして、zipファイル内のファイルを指定します。
  
 
  python <zipファイル名のパス>/<zip内ファイルのパス>
 
  python <zipファイル名のパス>/<zip内ファイルのパス>
 +
 +
起動されるコードから、zipファイル内の他のモジュールやパッケージを普通に import できます。
 +
でも、zip内の他のファイルにアクセスするには zip 内のファイルを閲覧するライブラリを使う必要が有ります。
 +
 +
python <zipファイル名のパス>/<zip内ディレクトリのパス>
 +
 +
で起動した場合は、zipファイル内に <zip内ディレクトリのパス> が存在し、
 +
<zip内ディレクトリのパス> が指定するディレクトリ内に '''__main__.py''' が存在していることが必要です。
 +
python は __main__.py のモジュールレベルのコードを起動します。
 +
 +
また、
 +
python <zipファイル名のパス>
 +
という形式の起動では、zipファイル内のトップに __main__.py ファイルが存在している必要が有ります。
 +
この __main__.py が起動されます。
 +
 +
結局のところ、zipファイルはディレクトリとみなされ、
 +
zipファイル内のファイルやディレクトリを指定して起動を行っているだけで、
 +
起動の様子は'''「[[#スクリプトファイルを指定して起動する|スクリプトファイルを指定して起動する]]」'''や
 +
'''「[[#ディレクトリを指定して起動する|ディレクトリを指定して起動する]]」''' と全く同じです。
 +
'''__name__変数'''や '''sys.path へのディレクトリの追加'''や'''注意'''も同じなので、そのあたりは
 +
'''「[[#スクリプトファイルを指定して起動する|スクリプトファイルを指定して起動する]]」'''や
 +
'''「[[#ディレクトリを指定して起動する|ディレクトリを指定して起動する]]」'''を参照してください。
 +
 +
==パッケージのエントリポイントを実行する==
 +
 +
アプリケーションがパッケージとして pythonランタイムや仮想環境にインストールされている場合、
 +
アプリケーションをコマンドで起動できます。
 +
 +
アプリケーションがパッケージの '''pyproject.toml''' に
 +
[project.scripts]
 +
コマンドの名称 = "パッケージ名:関数名"
 +
が記述されていると、パッケージを pip や uv などで環境に登録すると、
 +
コマンド(Windowsの場合はコマンドの名称.exe) がpython実行環境に登録されます。
 +
つまり CLI からコマンドとして起動できるようになります。
 +
 +
'''複数のコマンドを登録できます。'''
 +
 +
コマンドが起動するのは '''[project.scripts]''' に記述された パッケージの関数です。つまり関数が直に起動されます。
 +
但し、関数が実行される前に、パッケージの初期化(パッケージファイルのモジュールレベルのコード、又は __init__.py のモジュールレベルのコード)が実行されます。
 +
 +
'''実行されるpythonファイルの __name__ 変数は "__main__" にセットされません'''。実行されるファイルのモジュール名がセットされます。'''実行されるパッケージはインストール済みなので、sys.path にはパッケージのトップディレクトリが予め設定済みです'''。
 +
 +
===注意===
 +
WindowsのPIM版のシステムpythonにアプリをパッケージとしてインストールする場合、コマンドは Scriptsディレクトリにインストールされますが、Scriptsディレクトリに PATH は通ってないので'''コマンドを起動できません'''。'''py install --refresh''' を打つと '''~/AppData/Local/Python/bin''' にもコマンドが登録されて使えるようになります。
 +
 +
仮想環境の場合、パッケージをインストールすると仮想環境の Scriptsディレクトリにコマンドが登録されるので、即使えるようになります。
 +
 +
PIM版のシステムpythonにアプリをパッケージとしてインストールする場合、複数のシステムpythonに同じアプリをインストールすると、同じコマンド名が競合することになります。この場合 py install --refresh は新しい pythonのものを優先して登録するので注意してください。基本アプリは仮想環境で実行しましょう。
 +
 +
==パッケージを -m オプションで起動==
 +
 +
アプリケーションがパッケージとして pythonランタイムや仮想環境にインストールされている場合、
 +
アプリケーションのパッケージやモジュールを -m オプションで起動できます。
 +
python -m <モジュール名>
 +
通常パッケージがディレクトリの場合、実行するコードが無いのでパッケージを実行することはできませんが、
 +
パッケージがモジュールファイルの場合や、パッケージディレクトリが __main__.py ファイルを持っている場合、
 +
python -m パッケージ名 でパッケージを起動できます。
 +
 +
パッケージがモジュールファイルの場合は、モジュールのモジュールレベルのコードが、
 +
パッケージディレクトリに __main__.py が有る場合は __main__.py のモジュールレベルのコードが実行されます。
 +
 +
但し、__main__.py が実行される前に、__init__.py が有れば、そのモジュールレベルのコードが実行されます。
 +
 +
実行されるパッケージはインストール済みなので、'''sys.path にはパッケージのトップディレクトリが予め設定済み'''です。
 +
 +
'''起動されるモジュールの __name__ 変数が "__main__" にセットされます'''。
 +
 +
-m オプションでの起動の特徴は、'''py -3.14 -m XXXX''' や python3.14 -m XXXX というように、
 +
pythonの版を指定して起動できる点です。コマンドによるエントリポイント起動のようなややこしさはありません。
 +
必要に応じて使い分けてください。
 +
 +
==まとめ==
 +
 +
pythonのアプリの起動方法を紹介しました。
 +
 +
pythonのアプリをどこでも使えるツールとして使えるようにするなら'''「エントリポイント(コマンド)」'''が最も強力な起動方法でしょう。以下にその特徴と注意点をまとめておきます。
 +
 +
{| class="wikitable"
 +
|+ pythonアプリ起動方法 まとめ
 +
|-
 +
! 起動方法 !! 起動コード ||__name__ !! sys.path !! 特徴・備考
 +
|-
 +
| ファイル指定 || 指定ファイルのモジュールレベルのコード || "__main__" || ファイルのディレクトリが追加 || 最も基本的
 +
|-
 +
| ディレクトリ指定 || __main__.py のモジュールレベルのコード ||  "__main__" || ディレクトリが追加 || __main__.py が指定ディレクトリに必要
 +
|-
 +
| ファイル指定(zipファイル内) ||  指定ファイルのモジュールレベルのコード || "__main__" || ファイルのディレクトリが追加 || アプリを単一ファイルで配布できる。
 +
|-
 +
| ディレクトリ指定(zipファイル内) || __main__.py のモジュールレベルのコード || "__main__" || ディレクトリが追加 || __main__.py が指定ディレクトリに必要。
 +
 +
アプリを単一ファイルで配布できる。
 +
 +
zipファイルのトップに __main__.py を置けば、zipファイルをスクリプトファイルのように扱える。
 +
|-
 +
| エントリポイント(コマンド) || pyproject.toml で指定された モジュールの関数 || モジュール名そのまま || パッケージディレクトリが事前に追加
 +
|| pyproject.tomlで設定要。
 +
パッケージをインストールする必要あり。
 +
 +
コマンドは複数登録可能なので、様々な機能を一つのアプリで提供できる。
 +
|-
 +
| モジュール指定(-m) || 指定モジュールファイル又は __main__.py のモジュールレベルコード || "__main__" || パッケージディレクトリが事前に追加
 +
| モジュールファイル又は__main__.pyが必要。
 +
パッケージをインストールする必要あり。
 +
|}

2026年10月10日 (土) 02:30時点における最新版

メインページ>コンピュータの部屋#Python>Python Tips

はじめに

python でアプリケーションを起動するのに最も単純な方法は

python <pythonスクリプトファイルのパス>

でしょう。基本の基本です。

しかし、pythonにはアプリケーションを起動するための様々な方法が用意されています。この記事では、pythonでスクリプトを起動するためのいくつかの方法を紹介します。

スクリプトファイルを指定して起動する

既に「はじめに」で紹介した通り、アプリケーションは

python <pythonスクリプトファイルのパス>

で起動できます。

<pythonスクリプトファイルのパス>のファイルのモジュールレベルのコードが起動されます。起動されるモジュールにローカルな __name__ 変数は "__main__" に設定されます。

sys.path には <pythonスクリプトファイルのパス> のディレクトリが追加されます。

注意

sys.path にはアプリケーションのモジュールやパッケージのトップディレクトリが追加されないとモジュールやパッケージの検索がおかしくなります。 <pythonスクリプトファイルのパス> のディレクトリにはモジュールやパッケージのトップディレクトリを指定しましょう。

ディレクトリを指定して起動する

アプリケーションを

python <ディレクトリのパス>

で起動できます。

<ディレクトリのパス>に__main__.py が無ければ

python.exe: can't find '__main__' module in <ディレクトリのパス>

とエラーが表示されて実行できません。

<ディレクトリのパス>に__main__.py が有れば、__main__.py のモジュールレベルのコードが起動されます。 起動される__main__.pyにローカルな __name__ 変数は "__main__" に設定されます。

sys.path には <ディレクトリのパス> が追加されます。

注意

sys.path にはアプリケーションのモジュールやパッケージのトップディレクトリが追加されないと モジュールやパッケージの検索がおかしくなります。 <ディレクトリのパス>にはモジュールやパッケージのトップディレクトリを指定しましょう。

zipファイル内のファイルから起動する

python はzipで固められたアプリを起動できます。 やり方は簡単で、zipファイルをディレクトリであるかのようにして、zipファイル内のファイルを指定します。

python <zipファイル名のパス>/<zip内ファイルのパス>

起動されるコードから、zipファイル内の他のモジュールやパッケージを普通に import できます。 でも、zip内の他のファイルにアクセスするには zip 内のファイルを閲覧するライブラリを使う必要が有ります。

python <zipファイル名のパス>/<zip内ディレクトリのパス>

で起動した場合は、zipファイル内に <zip内ディレクトリのパス> が存在し、 <zip内ディレクトリのパス> が指定するディレクトリ内に __main__.py が存在していることが必要です。 python は __main__.py のモジュールレベルのコードを起動します。

また、

python <zipファイル名のパス>

という形式の起動では、zipファイル内のトップに __main__.py ファイルが存在している必要が有ります。 この __main__.py が起動されます。

結局のところ、zipファイルはディレクトリとみなされ、 zipファイル内のファイルやディレクトリを指定して起動を行っているだけで、 起動の様子は「スクリプトファイルを指定して起動する」や 「ディレクトリを指定して起動する」 と全く同じです。 __name__変数や sys.path へのディレクトリの追加や注意も同じなので、そのあたりは 「スクリプトファイルを指定して起動する」や 「ディレクトリを指定して起動する」を参照してください。

パッケージのエントリポイントを実行する

アプリケーションがパッケージとして pythonランタイムや仮想環境にインストールされている場合、 アプリケーションをコマンドで起動できます。

アプリケーションがパッケージの pyproject.toml に

[project.scripts]
コマンドの名称 = "パッケージ名:関数名"

が記述されていると、パッケージを pip や uv などで環境に登録すると、 コマンド(Windowsの場合はコマンドの名称.exe) がpython実行環境に登録されます。 つまり CLI からコマンドとして起動できるようになります。

複数のコマンドを登録できます。

コマンドが起動するのは [project.scripts] に記述された パッケージの関数です。つまり関数が直に起動されます。 但し、関数が実行される前に、パッケージの初期化(パッケージファイルのモジュールレベルのコード、又は __init__.py のモジュールレベルのコード)が実行されます。

実行されるpythonファイルの __name__ 変数は "__main__" にセットされません。実行されるファイルのモジュール名がセットされます。実行されるパッケージはインストール済みなので、sys.path にはパッケージのトップディレクトリが予め設定済みです。

注意

WindowsのPIM版のシステムpythonにアプリをパッケージとしてインストールする場合、コマンドは Scriptsディレクトリにインストールされますが、Scriptsディレクトリに PATH は通ってないのでコマンドを起動できません。py install --refresh を打つと ~/AppData/Local/Python/bin にもコマンドが登録されて使えるようになります。

仮想環境の場合、パッケージをインストールすると仮想環境の Scriptsディレクトリにコマンドが登録されるので、即使えるようになります。

PIM版のシステムpythonにアプリをパッケージとしてインストールする場合、複数のシステムpythonに同じアプリをインストールすると、同じコマンド名が競合することになります。この場合 py install --refresh は新しい pythonのものを優先して登録するので注意してください。基本アプリは仮想環境で実行しましょう。

パッケージを -m オプションで起動

アプリケーションがパッケージとして pythonランタイムや仮想環境にインストールされている場合、 アプリケーションのパッケージやモジュールを -m オプションで起動できます。

python -m <モジュール名>

通常パッケージがディレクトリの場合、実行するコードが無いのでパッケージを実行することはできませんが、 パッケージがモジュールファイルの場合や、パッケージディレクトリが __main__.py ファイルを持っている場合、 python -m パッケージ名 でパッケージを起動できます。

パッケージがモジュールファイルの場合は、モジュールのモジュールレベルのコードが、 パッケージディレクトリに __main__.py が有る場合は __main__.py のモジュールレベルのコードが実行されます。

但し、__main__.py が実行される前に、__init__.py が有れば、そのモジュールレベルのコードが実行されます。

実行されるパッケージはインストール済みなので、sys.path にはパッケージのトップディレクトリが予め設定済みです。

起動されるモジュールの __name__ 変数が "__main__" にセットされます。

-m オプションでの起動の特徴は、py -3.14 -m XXXX や python3.14 -m XXXX というように、 pythonの版を指定して起動できる点です。コマンドによるエントリポイント起動のようなややこしさはありません。 必要に応じて使い分けてください。

まとめ

pythonのアプリの起動方法を紹介しました。

pythonのアプリをどこでも使えるツールとして使えるようにするなら「エントリポイント(コマンド)」が最も強力な起動方法でしょう。以下にその特徴と注意点をまとめておきます。

pythonアプリ起動方法 まとめ
起動方法 起動コード __name__ sys.path 特徴・備考
ファイル指定 指定ファイルのモジュールレベルのコード "__main__" ファイルのディレクトリが追加 最も基本的
ディレクトリ指定 __main__.py のモジュールレベルのコード "__main__" ディレクトリが追加 __main__.py が指定ディレクトリに必要
ファイル指定(zipファイル内) 指定ファイルのモジュールレベルのコード "__main__" ファイルのディレクトリが追加 アプリを単一ファイルで配布できる。
ディレクトリ指定(zipファイル内) __main__.py のモジュールレベルのコード "__main__" ディレクトリが追加 __main__.py が指定ディレクトリに必要。

アプリを単一ファイルで配布できる。

zipファイルのトップに __main__.py を置けば、zipファイルをスクリプトファイルのように扱える。

エントリポイント(コマンド) pyproject.toml で指定された モジュールの関数 モジュール名そのまま パッケージディレクトリが事前に追加 pyproject.tomlで設定要。

パッケージをインストールする必要あり。

コマンドは複数登録可能なので、様々な機能を一つのアプリで提供できる。

モジュール指定(-m) 指定モジュールファイル又は __main__.py のモジュールレベルコード "__main__" パッケージディレクトリが事前に追加 モジュールファイル又は__main__.pyが必要。

パッケージをインストールする必要あり。