2017-04-11 72 views
0

我試圖用Windows 2012服務器上的gpg可執行文件解密文件。目前腳本訪問'try'塊,但是無限期地停留在那裏。該文件的大小約爲500MB,因此任何需要解密的文件都需要< 10分鐘。我讓它跑的最長的時間是一個小時。這裏是代碼爲:卡在一個python子進程調用

# 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)不能無限期地運行並報告有用的信息它無限期地運行。

讓我知道是否需要澄清。

+0

也許不相關,爲什麼你有'stdin = PIPE'? gpg可能正在等待某些東西被餵食,然後阻止。 – user2722968

+0

另外你不應該把你的整個命令行放在一個字符串中,使用程序名和個別參數。否則,你會在gpg端運行參數解析問題。 – user2722968

回答

3

從Python的文檔subprocess.check_call()

注:請不要使用stdout=PIPEstderr=PIPE使用此功能。子進程會阻塞它是否因管道未被讀取而產生足夠的輸出到管道來填充OS管道緩衝區。

考慮到你試圖解密500MB,我認爲可以安全地說你會達到管道大小的限制。我建議您用打開的文件描述符或現有的文件對象替換PIPE

順便說一句,我對你建立你的命令行的方式感到有點驚訝,我的理解是subprocess.check_call需要一個字符串列表,而不是一個字符串本身。

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

從版本3.3開始,超時選項被添加到subprocess模塊的許多功能中。您可能會發現調試問題很有用。

+0

你不會*有*通過一個列表,但這絕對是一個改進。另見http://stackoverflow.com/questions/3172470/actual-meaning-of-shell-true-in-subprocess – tripleee