次の各コマンド(合計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つの終了値のみを処理するため、今のように使用しないでください。cd
tar
rm
os.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.sql
2番目の呼び出し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")()
答え2
&&
シェルが最初の失敗したコマンドで停止し、終了ステータスを返すようにこれらのセミコロンをコマンドパイプラインに変更し、os.system()の戻りコードを確認します。