【Python基礎】subprocessモジュールを使ってPythonからターミナルやコマンドプロンプトを操作する方法(PythonファイルダブルクリックでStreamlit起動)

  • URLをコピーしました!
目次

subprocess

前回、PythonのSciPyでcurve_fitを用いてピークフィッティングする方法を紹介しました。

今回はsubprocessモジュールを使ってPythonからターミナルやコマンドプロンプトを操作する方法を紹介します。

それでは始めていきましょう。

subprocess.run

subprocessモジュールでターミナルやコマンドプロンプトを操作する関数は複数あるのですが、そのうち「subprocess.run」が推奨されているとのことです。

まずsubprocessをインポートし、「subprocess.run(“コマンド”)」とすると環境に合わせて、ターミナルやコマンドプロンプトのコマンドが実行されます。

import subprocess

subprocess.run("ls")

実行結果
python-subprocess-1.ipynb
python-subprocess-1.py
python-subprocess-2.ipynb
python-subprocess-2.py
test_1.ipynb
test_1.py
CompletedProcess(args='ls', returncode=0)

最後の「returncode=0」が処理が正常に行われたことを示しています。

「変数 = subprocess.run(“コマンド”)」とすると実行結果を変数に格納することができます。

import subprocess

result = subprocess.run("ls")

print(result)

実行結果
python-subprocess-1.ipynb
python-subprocess-1.py
python-subprocess-2.ipynb
python-subprocess-2.py
test_1.ipynb
test_1.py
CompletedProcess(args='ls', returncode=0)

コマンドに引数を与える方法

コマンドに引数を与える場合は「subprocess.run([“コマンド”, “引数1”])」のようにリストとして渡します。

import subprocess

result = subprocess.run(["ls", "-a"])

print(result)

実行結果
.
..
.ipynb_checkpoints
python-subprocess-1-1.ipynb
python-subprocess-1-1.py
python-subprocess-1-2.ipynb
python-subprocess-1-2.py
test1-2.ipynb
test1-2.py
CompletedProcess(args=['ls', '-a'], returncode=0)

ちなみに引数をリストではなく、コマンドとしてそのまま書いてしまった場合はエラーとなります。

import subprocess

result = subprocess.run("ls -a")

print(result)

実行結果
---------------------------------------------------------------------------
FileNotFoundError                         Traceback (most recent call last)
Cell In[10], line 3
      1 import subprocess
----> 3 result = subprocess.run("ls -a")
      5 print(result)

(中略)

File /Library/Frameworks/Python.framework/Versions/3.10/lib/python3.10/subprocess.py:1842, in Popen._execute_child(self, args, executable, preexec_fn, close_fds, pass_fds, cwd, env, startupinfo, creationflags, shell, p2cread, p2cwrite, c2pread, c2pwrite, errread, errwrite, restore_signals, gid, gids, uid, umask, start_new_session)
   1840     if errno_num != 0:
   1841         err_msg = os.strerror(errno_num)
-> 1842     raise child_exception_type(errno_num, err_msg, err_filename)
   1843 raise child_exception_type(err_msg)

FileNotFoundError: [Errno 2] No such file or directory: 'ls\u3000-a'

Pythonファイルダブルクリック→Streamlit起動

なぜPythonからターミナルやコマンドプロンプトを操作したかったのかというと、Streamlitを簡単に起動したかったのです。

Streamlitは前に紹介したWebアプリフレームワークの一種です。

その起動時にはターミナルやコマンドプロンプト上で「streamlit run XXX.py」というコマンドを実行する必要がありました。

いちいちターミナルやコマンドプロンプトを立ち上げてコマンドを打つのが億劫になったわけです。

ということでPythonでターミナルやコマンドプロンプトを操作し、「streamlit run XXX.py」を実行するプログラムを作れば、そのファイルをダブルクリックするだけでstreamlitが起動するだろうというわけです。

ということでやってみました。

起動するstreamlitのプログラムはこちらです。

import streamlit as st

st.title("SUBPROCESS TEST")

これを「test.py」として保存します。

実行するとstresmlitが立ち上がり、タイトルとして「SUBPROCESS TEST」が表示されます。

このプログラムをターミナルやコマンドプロンプト上で実行するプログラムをこのように組んでみました。

import subprocess

subprocess.run(["streamlit", "run", "test.py"])

このファイルをダブルクリックで実行すると先ほどのタイトルに「SUBPROCESS TEST」と表示されたstreamlitが起動します。

shell = True

subprocess.runでは「subprocess.run([“コマンド”, “引数1”])」というようにリスト形式でコマンドを書くとお話ししましたが「shell = True」のオプションをつけることで、コマンドをそのまま認識してくれます。

つまり「subprocess.run(” コマンド 引数1”, shell = True)」というよう書くことができます。

ということで先ほどのstreamlitを起動するプログラムはこんな感じになります。

import subprocess

subprocess.run("streamlit run test.py", shell=True)

これを実行しても、先ほどのタイトルとして「SUBPROCESS TEST」が表示されるstreamlitが起動されます。

次回はNumPyで全ての要素が1の配列を作成する方法を紹介します。

ではでは今回はこんな感じで。

よかったらシェアしてね!
  • URLをコピーしました!

コメント

コメントする

目次