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

Python 为什么popen()无法正确写入输出?,python,subprocess,popen,Python,Subprocess,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.0

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

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
p = subprocess.Popen(
    [
        "w2cropconv",
        "-i",
        path,
        "-I",
        "HeightofOC",
        "-o",
        output_directory,
        "-t",
        NWloc,
        "-b",
        SEloc,
        "-s",
        "0.005 0.005 1",
        "-R",
    ]
)
我使用以下命令使用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
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()函数不会写入该目录,即使它确实应该这样做。这不是我的代码中的一个bug,我确信这是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
完全相同)


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

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

你可以这样做

p = subprocess.Popen(...)
retcode = p.wait()
if retcode != 0:
    # process likely failed
或者更短的(在您的情况下,
Popen
完全相同)


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

您是否绝对确定
path
output\u目录
完全正确?也许可以尝试
子流程。检查调用()
<如果命令以非零状态代码退出,
Popen
本身不会引发异常。(此外,
Popen
将返回一个对象,表示您必须等待退出的进程;
check_call()
会为您执行此操作。)请参阅我的文章,我已编辑以显示两者完全相同。你能解释一下你的第二个评论吗@AKXAre你绝对确定
path
output\u目录
是正确的吗?也许可以尝试
子流程。检查调用()
<如果命令以非零状态代码退出,
Popen
本身不会引发异常。(此外,
Popen
将返回一个对象,表示您必须等待退出的进程;
check_call()
会为您执行此操作。)请参阅我的文章,我已编辑以显示两者完全相同。你能再解释一下你的第二个评论吗@AKXIt也不是这样的。这可能与我使用的算法有关。这两个命令有完全相同的输出,直到基本上正确的一个调用另一个脚本并返回不同的输出,我将在我的原始问题中发布。这可能会让你知道发生了什么。我使用os.system解决了这个问题。不过谢谢你的帮助,这样也不行。这可能与我使用的算法有关。这两个命令有完全相同的输出,直到基本上正确的一个调用另一个脚本并返回不同的输出,我将在我的原始问题中发布。这可能会让你知道发生了什么。我使用os.system解决了这个问题。谢谢你的帮助。