コマンドが正常に完了した後に肯定的な信号を取得する方法

コマンドが正常に完了した後に肯定的な信号を取得する方法

次の各コマンド(合計4つ)に対してエラーが発生したときにコマンドの1つが例外をスローする場合は、例外を発生させたいと思います。最終的に os.system() を使って Python で実行します。

import os

x =\
    "../../../mysql/bin/mysqldump\
    --host=localhost\
    --port=3306\
    --databases ****\
    --user=****\
    --password=****\
    --default-character-set=utf8\
    --add-drop-database\
    --add-drop-table\
    --add-locks\
    --complete-insert\
    --extended-insert\
    --lock-all-tables\
    --create-options\
    --disable-keys\
    --quick\
    --order-by-primary\
    --set-charset\
    --tz-utc\
    > dump/test.sql;\
    cd dump;\
    tar -zcf test.sql.tar.gz test.sql;\
    rm test.sql;"

os.system(x)

どんなアイデアがありますか?

ベストアンサー1

「各コマンドに対して」が、、、および を意味すると仮定すると、これらの例外発生は終了状態が 0 (ゼロ)mysqldumpではないことを意味します。これは1つの終了値のみを処理するため、今のように使用しないでください。cdtarrmos.system()

Python例外の要件に応じて、コマンドに基づいてエラーを見つけることが主なsubprocess.check_output()候補になります。周囲に薄いレイヤーがありますが、subprocess.call()呼び出されたコマンドのゼロ以外の終了時にスローされる文字と例外とは反対です(終了値のみが返されます)。また、コマンド出力はstdoutとして返され、Pythonレベルでさまざまなコマンドをリンクしたり、出力をファイルに書き込むことができます(また、非例外をトリガしない可能性がある警告に対してプログラム出力を調べる可能性を提供します)。ゼロ終了状態)。check_output()call()check_output()

私は次のことをします。

test_sql = subprocess.check_output([
 "../../../mysql/bin/mysqldump",
 "--host=localhost",
 "--port=3306",
 "--databases ****",
 "--user=****",
 "--password=****",
 "--default-character-set=utf8",
 "--add-drop-database",
 "--add-drop-table",
 "--add-locks",
 "--complete-insert",
 "--extended-insert",
 "--lock-all-tables",
 "--create-options",
 "--disable-keys",
 "--quick",
 "--order-by-primary",
 "--set-charset",
 "--tz-utc",
])
# analyse test_sql if necessary
with open("dump/test.sql", "w") as fp:
   fp.write(test_sql)
os.chdir('dump')
subprocess.check_output("tar -zcf test.sql.tar.gz test.sql".split())
os.remove("test.sql")

check_output()使用inputキーワード引数(Python 3.4の新機能)ファイルに書き込んでtest.sql2番目の呼び出しtest_sqlに直接渡すこともできません。check_output()ただし、このモジュールを使用してPythonから直接tarファイルを作成できますtarfile

そしてplumbumリダイレクトをサポートするので、シェルプログラム呼び出しの構造を理解する方が簡単です。

import sys
sys.path.insert(0, "../../../mysql")

from plumbum.cmd import myslqdump
(mysqldump[
  "--host=localhost",
  "--port=3306",
  "--databases ****",
  "--user=****",
  "--password=****",
  "--default-character-set=utf8",
  "--add-drop-database",
  "--add-drop-table",
  "--add-locks",
  "--complete-insert",
  "--extended-insert",
  "--lock-all-tables",
  "--create-options",
  "--disable-keys",
  "--quick",
  "--order-by-primary",
  "--set-charset",
  "--tz-utc",
 ] > "test.sql")()

おすすめ記事