2017-03-24 40 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