サーバーのテスト環境作成時に、PythonでLinuxコマンドを実行したかった際のメモ。
まず、基本形は以下のとおりです。
コマンドは1行の文字列で実行できません。
コマンドと引数はリストにして渡してあげる必要があります。
[重要]
@shiracamus さんからレビューいただきました!
リストで渡さなくても実行できるっぽい。
import subprocess
# 間違い
# subprocess.call( 'cp -a test.txt text2.text' )
# リストに分割して実行が正しい
subprocess.call( ['cp', '-a', 'test.txt', 'text2.text'] )
#
ただ、リストで渡すのめんどい。。。
Linux上で簡易実行テストしたコマンドをいちいちリストにしてられないし、メンテナンス性も悪い。移植バグも起こりやすいし。
PHP なら shell_exec() 関数で文字列から簡単にLinuxコマンドを実行できるのに。。。
しょうがないのでPHP風の簡易ラッパー関数を作りました。
import subprocess
def shell_exec(cmd: str):
"""
Shell execute.
"""
for cmd_line in cmd.splitlines():
subprocess.call(cmd_line.strip().split())
仕様はすごく簡単
- テキストを行ごとに分割
- 実行するコマンドの前後の空白をトリム
- 実行するコマンドを空白で分割しリスト化する
- コマンド実行
使用方法は以下のような感じで、複数行のコマンドを1行ずつ実行可能です。
shell_exec(""" cd /home/test
touch test.txt
cp -a test.txt text2.text """)
ただし、引数がダブルクォーテーションで囲まれているケース(引数内に空白が存在するケース)は考慮していません。
また、エラーも拾っていません。
簡易版なので。