2017-04-11 6 views
0

Windows 2012 서버에서 실행 가능한 gpg 파일을 해독하려고합니다. 현재 스크립트는 'try'블록에 액세스하지만 무한정 머물러 있습니다. 파일 크기가 약 500MB이므로 아무 것도 < 10 분이 걸립니다. 가장 긴 시간은 1 시간입니다. 이 코드는 다음과 같습니다.파이썬 서브 프로세스 호출 내부에 갇혀

# decrypt the pgp file 
comm = (gpg + ' --batch --passphrase passphrase --homedir='+current_path 
      +' -o ' + zip_name +' --decrypt ' + file_name) 

try: 
    subp = subprocess.check_call(comm, stdout=PIPE, stdin=PIPE, stderr=STDOUT) 
    stdout_data, stderr_data = subp.communicate() 
    print stdout_data, stderr_data 
except subprocess.CalledProcessError as e: 
    print e.output 
    logger.update('Error', process, runtime=0, error=e) 
    raise Exception('Error Decrypting File') 

포함되지 않았지만 키를 가져 왔습니다.

추가/제거 또는 다르게 수행 할 수있는 항목이 1) 호스트 시스템 (Windows 서버) 내에서 발생하는 상황을 더 잘 파악하고 2) 무기한 실행하지 않고 유용한 정보를보고하는 이유 그것은 무기한으로 달리고있었습니다.

설명이 필요한지 알려주세요. subprocess.check_call()에 대한 파이썬의 문서에서

+0

아마도 'stdin = PIPE'가있는 이유는 무엇입니까? gpg는 먹이를주고 기다리는 것을 기다리고 있을지도 모릅니다. – user2722968

+0

또한 명령 줄 전체를 하나의 문자열로 묶어서는 안되며 모든 것에 프로그램 이름과 개별 인수를 사용하십시오. 그렇지 않으면 gpg 측에서 인수 분석 구문 분석 문제가 발생합니다. – user2722968

답변

3

:

참고 :이 기능을 stdout=PIPE 또는 stderr=PIPE를 사용하지 마십시오. 자식 프로세스는 파이프가 읽히지 않을 때 OS 파이프 버퍼를 채우기에 파이프로 충분한 출력을 생성하면 차단됩니다.

500MB의 암호를 해독하려는 경우 파이프 크기 제한에 도달한다고 말하면 안전하다고 생각합니다. PIPE을 열린 파일 기술자 또는 기존 파일 객체로 바꾸는 것이 좋습니다.

나는 명령 행을 만드는 방식에 약간 놀랐다. subprocess.check_call은 문자열 자체가 아니라 문자열 목록을 기대하고있다. 버전 3.3에서 시작

command = [gpg, "--batch", "--passphrase passphrase", "--homedir=current_path", 
      "-o", "zip_name", "--decrypt", file_name] 

, 타임 아웃 옵션은 subprocess 모듈의 많은 기능이 추가되었습니다. 문제를 디버깅하는 것이 유용 할 수 있습니다.

+0

목록에 합격 할 필요는 없지만 여기서 확실히 개선되었습니다. http://stackoverflow.com/questions/3172470/actual-meaning-of-shell-true-in-subprocess를 참조하십시오. – tripleee