0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

PythonでPHPのshell_exec風にLinuxコマンド実行する簡易版

Last updated at Posted at 2020-06-10

サーバーのテスト環境作成時に、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. テキストを行ごとに分割
  2. 実行するコマンドの前後の空白をトリム
  3. 実行するコマンドを空白で分割しリスト化する
  4. コマンド実行

使用方法は以下のような感じで、複数行のコマンドを1行ずつ実行可能です。

shell_exec(""" cd /home/test
               touch test.txt
               cp -a test.txt text2.text """)

ただし、引数がダブルクォーテーションで囲まれているケース(引数内に空白が存在するケース)は考慮していません。
また、エラーも拾っていません。
簡易版なので。

0
0
2

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?