다음 각 명령(총 4개)에 대해 오류가 발생할 때 명령 중 하나가 예외를 발생시키는 경우 예외를 발생시키고 싶습니다. 궁극적으로 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()
호출된 명령의 0이 아닌 종료 시 던져지는 문자 및 예외와는 반대입니다(종료 값만 반환됨). 또한 명령 출력은 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
두 번째 호출 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()의 반환 코드를 확인하십시오.