Linux で新しいターミナルを開いてコマンドを実行する Python スクリプトを作成する
- Linux で新しいターミナルを開いてコマンドを実行する Python スクリプトを作成する
- Linux で Python のバージョンを確認する Python スクリプトを作成する
- 開いているターミナルを有効に保ち、その中でコマンドを実行する Python スクリプト
-
Linux で Python サブモジュール
subprocess()
を使用して新しいターミナルにコマンドを渡す - まとめ
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\"'")
コードは何をしますか?
-
コードの最初の行で Python モジュール
os
がインポートされます。 このモジュールは、コマンドをオペレーティング システムに渡すのに役立ちます。 -
実行する必要があるコマンド ライン構文は、
My_Cmmnd
という名前の変数に保存されます。 この例で使用されている構文は、システムの Python バージョンをチェックします。My_Cmmnd = "python3 --version"
-
コードの 3 行目は、コマンドをシステムに送信します。
os.system("gnome-terminal -e 'bash -c \"" + My_Cmmnd + ";bash\"'")
上記のコード スニペットは、次のことを行います。
os.system()
はサブシェルを起動し、括弧内のコマンドを実行します。gnome-terminal
コマンドは、Linux OS 内で新しいgnome-terminal
を起動します。- 変数
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,
)
出力:
このコマンドは、引数がシェルに渡されるときに文字列として実行されます。 その結果、シェルは subprocess()
の実行の開始時に文字列をコマンド引数として解釈します。
上記の方法の欠点は、シェルが shell=true
を使用して明示的に呼び出されると、空白を含むすべてのメタ文字が子プロセスに渡されることです。これは、シェル インジェクションのイベントで脅威となります。
このような状況を回避するには、代わりに Python リストを使用してください。 リストを使用する場合、呼び出すコマンドはリストの 0 番目のインデックスに配置され、他の引数はそれに続きます。
前の例で使用したコマンドをリストとして呼び出します。
import subprocess
subprocess.run(["ls", "-la"])
出力:
オプション 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 でコマンドを簡単に実行できるはずです。