4

Pythonでosモジュールを使用して実行したい定期的なmysqldumpコマンドを追跡する簡単な方法を取り入れようとしています。私はこれを書きましたが、テストでは、mysqldumpコマンドがエラーで完了した場合でも例外は発生しません。私はPythonにかなり慣れていないので、これにひどく近づいているかもしれませんが、正しい方向に向けられるようにしようと思いました。

db_dump = "mysqldump -u %s -p%s --socket=source_socket --databases %s | mysql -u %s -p%s   --socket=dest_socket" % (db_user, db_pass, ' '.join(db_list), db_user, db_pass)

try:
    os.system(db_dump)
except:
    logging.error("databases did not dump")
else:    
    logging.info("database dump complete")
4

3 に答える 3

5

os.system は、システムコマンドを呼び出すための非常に堅牢または強力な方法ではありません。またはを使用することをお勧めしsubprocess.check_output()ますsubprocess.check_call

つまり、

>>> cmd = 'ls -l'
>>> badcmd = 'ls /foobar'
>>> subprocess.check_call(cmd.split())
0
>>> subprocess.check_call(badcmd.split())
ls: /foobar: No such file or directory
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/subprocess.py", line 511, in check_call
    raise CalledProcessError(retcode, cmd)
subprocess.CalledProcessError: Command '['ls', '/foobar']' returned non-zero exit status 1
于 2012-12-06T22:12:40.953 に答える
2

これが私がすることです。

import logging
import subprocess
log = logging.getLogger(__name__)

cmd = "mysqldump -u %s -p%s --socket=source_socket --databases %s | mysql -u %s -p%s " \
      "--socket=dest_socket" % (db_user, db_pass, ' '.join(db_list), db_user, db_pass)

process = subprocess.Popen(cmd, shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE.PIPE)
stdout, stderr = process.communicate()
stdout = [x for x in stdout.split("\n") if x != ""]
stderr = [x for x in stderr.split("\n") if x != ""]

if process.returncode < 0 or len(stderr):
    for error in stderr:
        log.error(error)
于 2012-12-06T22:27:43.963 に答える
2

os.system()整数の結果コードを返します。0 が返された場合、コマンドは正常に実行されました。ゼロ以外の値を返す場合は、エラーを示します。

db_dump = "mysqldump -u %s -p%s --socket=source_socket --databases %s | mysql -u %s -p%s   --socket=dest_socket" % (db_user, db_pass, ' '.join(db_list), db_user, db_pass)

result = os.system(db_dump)
if 0 == result:
    logging.info("database dump complete")
else:
    logging.error("databases did not dump; result code: %d" % result)

@COpython のように、 の使用をお勧めしますsubprocess。よりも少し複雑ですos.system()が、非常に柔軟です。os.system()出力は端末に送信されますsubprocessが、出力を収集できるため、エラーメッセージなどを検索できます。または、出力を破棄することもできます。

于 2012-12-06T22:11:20.487 に答える