2017-03-24 45 views
0

在我的Python/Django代碼中,我調用gdalbuildvrt進程。這個過程應該創建一個.VRT文件,但它不會。爲了檢查它,我將子進程輸出寫入調試文件。這就是我要做的事:如何在Python/Django中調試子進程調用

process = subprocess.Popen(["gdalbuildvrt", mosaic, folder], stdout=subprocess.PIPE) 
stdout = process.communicate()[0] 

with open(os.path.join(os.path.dirname(os.path.abspath(__file__)), "debug.txt"), 'w') as file: 
    file.write('{}'.format(stdout) + " -> " + mosaic) 

結果我看到這個文件DEBUG.TXT:

b'0...10...20...30...40...50...60...70...80...90...100 - done.\n' -> /var/www/vwrapper/accent/accent/layers/raw/mosaic.vrt 

所以,你可以看到調試語句的第一部分說,它」好的:

0...10...20...30...40...50...60...70...80...90...100 - done. 

而第二部分說,應該創建/var/www/vwrapper/accent/accent/layers/raw/mosaic.vrt。但是,當我轉到目標文件夾並刷新它時,我看不到mosaic.vrt文件。那麼,這可能有什麼問題,我該如何解決?我應該補充說,在Windows機器上它是100%好的,但在CentOS上它卻沒有。

+0

日誌'stderr'和'.returncode' ......這就是任何問題都會。 – TemporalWolf

+0

@TemporalWolf。你會如此善意地詳細說明這一點嗎?如果你願意,你可以做出完整的答案。 – Jacobian

回答

1
process = subprocess.Popen(["gdalbuildvrt", mosaic, folder], 
          stdout=subprocess.PIPE, stderr=subprocess.PIPE) 
stdout, stderr = process.communicate() 
ret = process.returncode 

process = subprocess.Popen(["gdalbuildvrt", mosaic, folder], 
          stdout=subprocess.PIPE, stderr=subprocess.STDOUT) 

其將重定向stderrstdout

然後登錄這兩件事情:

所有錯誤日誌應該是stderr,不stdout。任何退貨代碼將通過process.returncode出現。

你也很可能使用較高的工藝之一,像subprocess.check_call()

+0

謝謝!我剛剛檢查過它。 stderr獲取None值並且ret獲得0值。它似乎沒有錯誤,但仍然沒有做,它應該做什麼。我真的很想知道,可能是錯的。 – Jacobian

+1

@Jacobian我做了一個編輯。你必須確保你爲'stderr'添加一個管道或者將它重定向到'stdout' – TemporalWolf

+1

太棒了!現在我看到錯誤在哪裏。非常感謝! – Jacobian