명령이 성공적으로 완료된 후 긍정적인 신호를 얻는 방법

명령이 성공적으로 완료된 후 긍정적인 신호를 얻는 방법

다음 각 명령(총 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()의 반환 코드를 확인하십시오.

관련 정보