【问题标题】:Why is popen() unable to write output correctly?为什么 popen() 无法正确写入输出?
【发布时间】:2020-11-09 20:05:36
【问题描述】:

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

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 .

如果我没有马上回答,请见谅,我很头疼。

【问题讨论】:

  • 您确定pathoutput_directory 完全正确吗?也许试试subprocess.check_call();如果命令以非零状态码退出,Popen 本身不会引发异常。
  • (另外,Popen 将返回一个表示您必须等待退出的进程的对象;check_call() 会为您执行此操作。)
  • 请看我的帖子,我已经编辑显示两者完全相同。你能解释一下你的第二条评论吗@AKX

标签: python subprocess popen


【解决方案1】:

假设w2cropconv 实用程序需要一段时间来完成它的裁剪和转换工作,您需要等待它完成(我的意思是,如果这是您想要的)。只需执行p = subprocess.Popen(...) 即可启动该过程,然后继续使用您的代码。

你可以这样做

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

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

subprocess.check_call(...)

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

【讨论】:

  • 它也不是这样工作的。它可能特定于我正在使用的算法。这两个命令具有完全相同的输出,直到基本上正确的命令调用另一个脚本并返回不同的输出,我将在我的原始问题中发布。它可能会让您了解正在发生的事情。
  • 我能够使用 os.system 解决问题。不过感谢您的帮助。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-09-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-10-14
相关资源
最近更新 更多