Python からのシステム コマンドの実行
Python は、外部プログラムやシステム コマンドをスクリプトから直接実行するための強力な機能を提供します。この機能を使用すると、オペレーティング システムで利用できる膨大なツールを利用しながら、Python のシンプルさを活用できます。
反復的なタスクを自動化する場合でも、複雑なワークフローを統合する場合でも、Python でシステム コマンドを呼び出す方法を理解すると、生産性が大幅に向上します。このガイドでは、これを効果的に達成するためのさまざまな方法を検討します。
指示 | 説明 |
---|---|
subprocess.run | サブシェルでコマンドを実行します。出力とエラーをキャプチャできます。 |
subprocess.run([...], capture_output=True) | 実行されたコマンドの標準出力および標準エラーをキャプチャします。 |
subprocess.run([...], shell=True) | シェルを通じてコマンドを実行し、ワイルドカードなどのシェル機能を許可します。 |
subprocess.Popen | 新しいプロセスでコマンドを実行し、その実行をより詳細に制御できるようにします。 |
process.stdout.readline() | プロセスの標準出力から出力を 1 行読み取ります。 |
os.system | サブシェルでコマンドを実行します。これは、単純なコマンドの実行によく使用されます。 |
subprocess.check_output | コマンドを実行し、その出力を返します。コマンドが失敗した場合は例外を発生させます。 |
os.environ.copy() | 現在の環境変数のコピーを作成し、変更できるようにします。 |
env parameter in subprocess.run | 新しいプロセスの環境変数を指定します。 |
Python でのスクリプト実行を理解する
提供されているスクリプトは、Python を使用して外部コマンドを実行するさまざまな方法を示しています。の subprocess.run コマンドは多用途であり、Python スクリプトからシェル コマンドを直接実行できます。例えば、 subprocess.run(['echo', 'Hello, World!']) メッセージをコンソールに出力しますが、 subprocess.run(['ls', '-l'], capture_output=True, text=True) の出力をキャプチャします ls -l コマンドを実行すると、詳細なディレクトリのリストが表示されます。使用する shell=True と subprocess.run ワイルドカード拡張などのシェル機能を使用できるため、より複雑なコマンドに便利です。
の subprocess.Popen コマンドは、非同期コマンドの実行と、プロセスの入出力ストリームとの対話を可能にすることで、コマンド実行をより詳細に制御します。たとえば、次のようなスクリプトの例は、 subprocess.Popen(['ping', 'localhost'], stdout=subprocess.PIPE) ローカル マシンに継続的に ping を送信し、出力の各行を読み取ります。さらに、 os.system 単純なコマンドの実行に使用されますが、柔軟性に欠けます。 subprocess。環境変数は、次を使用して変更し、サブプロセスに渡すことができます。 os.environ.copy() そしてその env のパラメータ subprocess.run、環境に基づいて動的なコマンドの実行が可能になります。
Python での外部コマンドの実行
Pythonのサブプロセスモジュールを使用する
import subprocess
# Example 1: Running a simple shell command
subprocess.run(['echo', 'Hello, World!'])
# Example 2: Capturing the output of a command
result = subprocess.run(['ls', '-l'], capture_output=True, text=True)
print(result.stdout)
# Example 3: Running a command with shell=True
subprocess.run('echo Hello from the shell', shell=True)
# Example 4: Checking the return code
result = subprocess.run(['ls', 'nonexistentfile'], capture_output=True)
if result.returncode != 0:
print('Command failed')
# Example 5: Using subprocess.Popen for more control
process = subprocess.Popen(['ping', 'localhost'], stdout=subprocess.PIPE)
while True:
output = process.stdout.readline()
if output == b'' and process.poll() is not None:
break
if output:
print(output.strip().decode())
Python を使用したシステムタスクの自動化
os.system モジュールと subprocess モジュールの使用
import os
import subprocess
# Example 1: Using os.system to run a command
os.system('echo This is a test')
# Example 2: Running a command and capturing output with subprocess
result = subprocess.run(['date'], capture_output=True, text=True)
print('Current date and time:', result.stdout)
# Example 3: Executing multiple commands
commands = ['echo First command', 'echo Second command']
for cmd in commands:
os.system(cmd)
# Example 4: Running a command with environment variables
env = os.environ.copy()
env['MY_VAR'] = 'Hello'
subprocess.run('echo $MY_VAR', shell=True, env=env)
# Example 5: Handling command errors
try:
subprocess.check_output(['false_command'], stderr=subprocess.STDOUT)
except subprocess.CalledProcessError as e:
print('An error occurred:', e.output.decode())
システムコマンド実行のための高度なテクニック
Python でシステム コマンドを実行するもう 1 つの側面には、 shlex シェルコマンドの解析を処理するモジュール。このモジュールは、シェルコマンドをリスト形式に分割する方法を提供し、それを次に渡すことができます。 subprocess 機能。これにより、スペースを含む引数が正しく処理されるようになります。さらに、 subprocess.PIPE 標準入力、出力、およびエラー ストリームを親プロセスに送信し、より複雑なプロセス間通信を可能にします。
たとえば、コマンドを連鎖させてその出力を順次処理するには、次のコマンドを使用して、あるコマンドの出力を別のコマンドにパイプすることで実現できます。 subprocess.Popen。これにより、シェル スクリプトで行うのと同様の強力なコマンド シーケンスを作成できます。も使用できます threading 複数のサブプロセス コマンドを同時に実行すると、特に I/O バウンドのタスクを処理する場合に、スクリプトの効率が向上します。
Python でのシステム コマンドの実行に関するよくある質問
- Python でシェル コマンドを実行してその出力を取得するにはどうすればよいですか?
- 使用 subprocess.run と capture_output=True コマンドの出力をキャプチャします。
- 違いは何ですか subprocess.run そして subprocess.Popen?
- subprocess.run はコマンドが完了するのを待つ単純なインターフェイスですが、 subprocess.Popen コマンドの実行をより詳細に制御できるようになり、非同期操作が可能になります。
- システムコマンド実行時のエラーはどのように処理すればよいですか?
- 使用 try そして except でブロックする subprocess.CalledProcessError エラーをキャッチして処理します。
- 環境変数をコマンドに渡すことはできますか?
- はい、使用してください env パラメータの subprocess.run または subprocess.Popen 環境変数を渡すために。
- 複数のコマンドを順番に実行するにはどうすればよいですか?
- 使用 subprocess.run または subprocess.Popen ループまたはチェーンコマンドでパイプを使用して subprocess.Popen。
- ユーザー入力が必要なコマンドを実行するにはどうすればよいですか?
- 使用 subprocess.Popen と stdin=subprocess.PIPE を使用してプロセスと通信します process.communicate。
- 用途は何ですか shlex コマンド実行中?
- shlex シェル コマンドを正しく解析し、スペースを含む引数が適切に処理されるようにします。
- バックグラウンドでコマンドを実行するにはどうすればよいですか?
- 使用 subprocess.Popen プロセスが完了するのを待たずに、または threading バックグラウンド実行を管理します。
システムコマンド実行のための高度なテクニック
Python でシステム コマンドを実行するもう 1 つの側面には、 shlex シェルコマンドの解析を処理するモジュール。このモジュールは、シェルコマンドをリスト形式に分割する方法を提供し、それを次に渡すことができます。 subprocess 機能。これにより、スペースを含む引数が正しく処理されることが保証されます。さらに、 subprocess.PIPE 標準入力、出力、およびエラー ストリームを親プロセスに送信し、より複雑なプロセス間通信を可能にします。
たとえば、コマンドを連鎖させてその出力を順次処理するには、次のコマンドを使用して、あるコマンドの出力を別のコマンドにパイプすることで実現できます。 subprocess.Popen。これにより、シェル スクリプトで行うのと同様の強力なコマンド シーケンスを作成できます。も使用できます threading 複数のサブプロセス コマンドを同時に実行すると、特に I/O バウンドのタスクを処理する場合に、スクリプトの効率が向上します。
Python でのコマンド実行に関する最終的な考え方
Python での外部コマンドの実行は、スクリプト作成や自動化タスクを大幅に強化できる多用途かつ強力な機能です。を使用することで、 subprocess モジュールを使用すると、シェル コマンドを実行し、その出力をキャプチャし、エラーを効果的に処理できます。の os.system function は、基本的なコマンド実行のより簡単な代替手段を提供します。さらに、 shlex モジュールは、複雑なシェル コマンドを適切に解析することを保証します。これらの手法を理解すると、オペレーティング システムのコマンド ライン ツールの可能性を最大限に活用しながら、Python の強みを活用できるようになります。