对于以下每个命令(总共四个),如果其中一个命令在发生错误时抛出异常,我希望得到一个异常。最终,我将使用 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
假设“对于每个命令”您的意思是mysqldump
、cd
、tar
和rm
,这些抛出异常意味着退出状态不为 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.sql
并test_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() 的返回代码。