如何在成功完成命令后获得积极信号

如何在成功完成命令后获得积极信号

对于以下每个命令(总共四个),如果其中一个命令在发生错误时抛出异常,我希望得到一个异常。最终,我将使用 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

假设“对于每个命令”您的意思是mysqldumpcdtarrm,这些抛出异常意味着退出状态不为 0(零),您不应该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()sinput关键字参数(Python 3.4 中的新增功能)您还可以不写入文件test.sqltest_sql直接将其传递给第二次check_output()调用。但随后您可以使用该模块直接从 Python 中编写 tar 文件tarfile

plumbum更容易理解 shell 程序调用的结构,因为它支持重定向:

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

将这些分号更改为&&在命令管道中,以便 shell 将在第一个失败的命令处停止并返回其退出状态,然后检查 os.system() 的返回代码。

相关内容