簡體   English   中英

如何在Python / Django中調試子流程調用

[英]How to debug subprocess call in Python/Django

在我的Python / Django代碼中,我稱為gdalbuildvrt進程。 此過程應創建一個.VRT文件,但不是。 為了檢查它,我將子過程輸出寫入調試文件。 這是我的方法:

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

因此,您可以看到debug語句的第一部分說,沒關系:

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上則不能。

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)

這會將stderr重定向到stdout

然后記錄這兩件事:

所有錯誤日志記錄應該在stderr ,而不是stdout 並且任何返回碼都將通過process.returncode出現。

您可能還可以使用更高級別的進程之一,例如subprocess.check_call()

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM