Linux で新しいターミナルを開いてコマンドを実行する Python スクリプトを作成する

Jay Shaw 2023年6月21日
  1. Linux で新しいターミナルを開いてコマンドを実行する Python スクリプトを作成する
  2. Linux で Python のバージョンを確認する Python スクリプトを作成する
  3. 開いているターミナルを有効に保ち、その中でコマンドを実行する Python スクリプト
  4. Linux で Python サブモジュール subprocess() を使用して新しいターミナルにコマンドを渡す
  5. まとめ
Linux で新しいターミナルを開いてコマンドを実行する Python スクリプトを作成する

Linux オペレーティング システムは、プログラマーが広く使用する多目的端末で知られています。 しかし、同じ構文セットを繰り返し記述している場合があり、退屈で時間がかかることがあります。

Linux コマンドをファイルに事前に書き込んでから、ターミナルで一度に実行する方法があるかどうか疑問に思ったことはありませんか? はい! あなたはできる。

事前に記述された端末構文をファイルに記述し、Python スクリプトを記述して一度に実行できます。 この記事では、Python スクリプトを作成して、新しいターミナルを開いてコマンドを実行する方法について説明します。

Linux で新しいターミナルを開いてコマンドを実行する Python スクリプトを作成する

始める前に、いくつかの基本をおさらいしましょう。 Python スクリプトは、ファイルを見つけて実行することにより、コマンド ライン インターフェイスで実行されます。 これらのファイルが実行され、出力が表示されます。

Python スクリプトを作成して新しいターミナルを開いてコマンドを実行するには、さまざまな方法があります。 最初の例は、Linux コマンドを渡してシステム内の Python のバージョンをチェックする Python スクリプトを作成する方法を示しています。

Linux で Python のバージョンを確認する Python スクリプトを作成する

ターミナルにコマンドを直接記述して Python のバージョンを確認する必要がある場合は、次の構文を使用します。

python3 --version

以下のように、システム内の Python のバージョンが表示されます。

jay@jay-virtual-machine:~$ python3 --version
Python 3.10.6

これはコマンド ライン構文です。つまり、ターミナルでのみ記述できます。 拡張子が.pyのテキストファイル(例:test.py)に平文で書き込もうとするとエラーになります。

python3 --version

出力:

jay@jay-virtual-machine:~$ python3 test.py
Traceback (most recent call last):
  File "/home/jay/test.py", line 1, in <module>
    python3 --version
NameError: name 'python3' is not defined

この問題を解決するには、Python コンパイラとターミナルの両方にとって意味のある構文にするために、Python スクリプトを作成する必要があります。

新しいターミナルを開いてコマンドを実行する Python スクリプトを作成するには、.py 拡張子を持つテキスト ファイルを作成し、次の構文を記述します。

import os

My_Cmmnd = "python3 --version"
os.system("gnome-terminal -e 'bash -c \"" + My_Cmmnd + ";bash\"'")

コードは何をしますか?

  1. コードの最初の行で Python モジュール os がインポートされます。 このモジュールは、コマンドをオペレーティング システムに渡すのに役立ちます。

  2. 実行する必要があるコマンド ライン構文は、My_Cmmnd という名前の変数に保存されます。 この例で使用されている構文は、システムの Python バージョンをチェックします。

    My_Cmmnd = "python3 --version"
    
  3. コードの 3 行目は、コマンドをシステムに送信します。

    os.system("gnome-terminal -e 'bash -c \"" + My_Cmmnd + ";bash\"'")
    

上記のコード スニペットは、次のことを行います。

  1. os.system() はサブシェルを起動し、括弧内のコマンドを実行します。
  2. gnome-terminal コマンドは、Linux OS 内で新しい gnome-terminal を起動します。
  3. 変数 My_Cmmnd の内容が Bash コマンドとして新しいターミナルに送信され、実行されます。

スクリプトは構文を実行し、目的の出力を表示します。

Python 3.10.6
jay@jay-virtual-machine:~$

開いているターミナルを有効に保ち、その中でコマンドを実行する Python スクリプト

最後の例では、Python スクリプトを作成して新しいターミナルを開き、コマンドを変数に格納して実行する方法を示しました。

一方、構文が 1 行のコマンドの場合は、変数に格納せずに直接配置できます。 .py 拡張子を持つファイルを作成し、次の構文を記述します。

import os

os.system("gnome-terminal -e 'bash -c \"python3 --version\" '")

上記の構文は、新しい端末を起動し、コマンドを実行します。 ただし、この方法を使用すると、コマンドが実行された直後に端末が閉じられます。

この問題を解決するには、次のコマンドで sleep タイマーを配置する必要があります。

import os

os.system("gnome-terminal -e 'bash -c \"python3 --version; sleep 5\" '")

上記の構文は、新しいターミナルを 5 秒間開いたままにしますが、必要に応じて増やすことができます。 端末を無期限にアクティブにしておく必要がある場合は、次の構文を使用します。

import os

os.system("gnome-terminal -e 'bash -c \"python3 --version; bash\" '")

これにより、ユーザーがターミナルを閉じるまで、ターミナルを開いてアクティブに保ちます。

Linux で Python サブモジュール subprocess() を使用して新しいターミナルにコマンドを渡す

Python スクリプトを作成して新しいターミナルを開き、Python サブモジュール os を使用してコマンドを実行する方法を学びました。 この組み込みライブラリを使用してコマンドを端末に渡すことは推奨されなくなりました。

これは、新しいバージョンの Python で os が廃止されたためです。 セキュリティ リスクを回避するには、代わりに Python サブモジュール subprocess を使用する必要があります。

新しいターミナルを開いて subprocess を使用してコマンドを実行する Python スクリプトを作成するには、前の例と同様に .py 拡張子を持つファイルを作成し、その中に次のコードを記述します。

import subprocess

My_Cmmnd = "ls"

process = subprocess.Popen(
    "gnome-terminal -e 'bash -c \"" + My_Cmmnd + ";bash\"'",
    stdout=subprocess.PIPE,
    stderr=None,
    shell=True,
)

UNIX コマンド ls は、現在のディレクトリ内のファイルを一覧表示します。 その結果、このコマンドを実行すると、現在のディレクトリ内のファイルの一覧が表示されます。

subprocess() モジュールが最初にインポートされます。 次に、コマンドは変数に格納されます。 process という名前の変数内で、subprocess() の引数が定義されています。

subprocess.Popen コンストラクターは、gnome-terminal -e 構文を読み取ると、新しい gnome-terminal 内で子プロセスを起動します。 最後に、Python スクリプトは新しいターミナルを開き、コマンドを実行します。

出力:

jay@jay-virtual-machine:~$ python3 test.py
Desktop    Downloads  Pictures	snap	   test2.py  Videos
Documents  Music      Public	Templates  test.py

Linux シェルが提供するその他の機能について学ぶために、subprocess() を使用してシェルに引数を送信する方法を調べてみましょう。 たとえば、次のプログラムのコマンド ls -la は、すべてのメタデータと隠しファイルを一覧表示します。

import subprocess

My_Cmmnd = "ls -la"

process = subprocess.Popen(
    "gnome-terminal -e 'bash -c \"" + My_Cmmnd + ";bash\"'",
    stdout=subprocess.PIPE,
    stderr=None,
    shell=True,
)

出力:

ls la コマンド

このコマンドは、引数がシェルに渡されるときに文字列として実行されます。 その結果、シェルは subprocess() の実行の開始時に文字列をコマンド引数として解釈します。

上記の方法の欠点は、シェルが shell=true を使用して明示的に呼び出されると、空白を含むすべてのメタ文字が子プロセスに渡されることです。これは、シェル インジェクションのイベントで脅威となります。

このような状況を回避するには、代わりに Python リストを使用してください。 リストを使用する場合、呼び出すコマンドはリストの 0 番目のインデックスに配置され、他の引数はそれに続きます。

前の例で使用したコマンドをリストとして呼び出します。

import subprocess

subprocess.run(["ls", "-la"])

出力:

ls la safe コマンド

オプション capture_output=True を設定することにより、コマンドの結果を変数内に格納することもできます。

import subprocess

saved_results = subprocess.run(["ls", "-la"], capture_output=True)

print(saved_results.stdout)

出力:

キャプチャ出力

出力に目的の結果が表示されていることがわかりますが、インデックスが作成されておらず、ファイル名が整理されていません。 これは、システムが ls -la コマンドの結果をバイト単位で保存したために発生します。

代わりに結果を文字列として取得するには、オプション text=True を設定します。

import subprocess

saved_results = subprocess.run(["ls", "-la"], capture_output=True, text=True)

print(saved_results.stdout)

出力:

文字列出力

まとめ

この記事では、Python スクリプトを作成して、新しいターミナルを開いてコマンドを実行する方法について説明します。 この記事を読んだ読者は、Python スクリプトを作成して新しいターミナルを開き、Linux でコマンドを簡単に実行できるはずです。