为什么popen无法正确写入输出?

问题描述

这是我正在使用的算法的特有类型。但基本上,我有一个使用以下命令运行的算法:

w2cropconv -i /mnt/data/SHAVE_cubes/20120329/multi0/code_index.xml -I "Heightof0C" -o /mnt/data/SHAVE_cubes/20120329/multi0/.. -t "38.4 -97.85 21" -b "37.8 -97.15 1" -s "0.005 0.005 1" -R

我使用以下命令通过popen()运行它:

p = subprocess.Popen(
    [
        "w2cropconv","-i",path,"-I","HeightofOC","-o",output_directory,"-t",NWloc,"-b",SEloc,"-s","0.005 0.005 1","-R",]
)

尽管popen()命令正确运行,但实际上不输出任何内容。在第一种情况下,算法输出/multi0/目录。 popep()函数不会写入该目录,即使确实如此。这不是我的编码中的错误,我坚信这是我不知道的popep()特有的东西。

我知道输入和输出目录是相同的,因为当我执行其中任何一个时,都会得到以下信息:

 key [i],val [/mnt/data/SHAVE_cubes/20120329/multi0/code_index.xml]
 key [I],val [HeightofOC]
 key [o],val [/mnt/data/SHAVE_cubes/20120329/Heightof0C]
 key [t],val [38.4 -97.85 21]
 key [b],val [37.8 -97.15 1]
 key [s],val [0.01 0.01 1]
 key [R],val [true]

当它们发散时,正确的过程将产生以下输出

(../util/code_W2Unit.cc:66 getUtUnit) Initializing UDUNITS,Version 2 or greater...
(../util/code_W2Unit.cc:82 getUtUnit) Set UDUNITS2_XML_PATH=/usr/local/WDSS2/WDSS2/w2/w2config/misc/udunits2.xml
(code_LatLonConverter.cc:208 processInputField) Converting LatLonGrid: Heightof0C at 20120329-210000 location (lat=[58.366001 deg],lon=[-139.856 deg],h=[0 km]) and creating 1 output grids
(code_DataRemapper.cc:138 getLookup) DataRemapper: creating lookup for LatLonGrid NWcorner: Loc: 58.4 -139.9  dim: [225 x 301]  latres: [0.188]  lonres: [0.275] to LatLonGrid NWcorner: Loc: 38.4 -97.8  dim: [120 x 140]  latres: [0.005]  lonres: [0.005]
(code_DataRemapper.cc:140 getLookup) There are Now 1 remapping lookup tables stored.
(code_NetcdfDataEncoder.cc:122 applySettings) Using FINAL SPARSEGRID threshold of {-1} based on settings in w2config/misc/dataformat .

如果我没有立即回答,请原谅我头疼。

解决方法

假设w2cropconv实用程序需要花费一些时间来完成其裁剪和转换操作,则需要等待它完成(我是说,如果您要这样做)。只需执行p = subprocess.Popen(...)即可开始该过程,然后继续处理您的代码。

你可以做

p = subprocess.Popen(...)
retcode = p.wait()
if retcode != 0:
    # process likely failed

或更短(在您的情况下,...Popen完全相同)

subprocess.check_call(...)

如果进程失败,它将在退出后为您引发异常,否则请等待。