Python子进程通信

时间:2014-10-14 18:04:58

标签: python command-line subprocess

我试图运行一个打开命令提示符的python脚本(OSGeo4W.bat是一个命令提示行)。我可以让它打开,但现在我想发送命令提示命令。

import subprocess

myProcess = subprocess.Popen(['C:\OSGeo4W64\OSGeo4W.bat'],shell = False)  #opens command prompt
myProcess.communicate('gdal2tiles -p raster -z 0-1 new.jpg abc') 
myProcess.wait()
print("my process has terminated")

我也试过

subprocess.check_call('gdal2tiles -p raster -z 0-1 new.jpg abc', shell=False)

我一直收到错误说" WindowsError:[错误2]系统无法找到指定的文件"

但是,如果我要保持命令提示符它打开并输入" ' gdal2tiles -p raster -z 0-1 new.jpg abc' "然后它会像我想的那样工作。帮助会很棒,谢谢!

2 个答案:

答案 0 :(得分:2)

尝试:

check_call('gdal2tiles -p raster -z 0-1 new.jpg abc', shell=True)

shell=True更改how the executable is searched on Windows

gdal2tiles仅适用于OSGeo4W.bat创建的环境:

shell = Popen(r'C:\OSGeo4W64\OSGeo4W.bat', stdin=subprocess.PIPE)
shell.communicate('gdal2tiles -p raster -z 0-1 new.jpg abc')
# you don't need shell.wait() here

注意:r""字面意思。有必要避免转义路径中的反斜杠。

答案 1 :(得分:-1)

对于那些仍在努力解决这个问题的人来说,这就是我所发现的。 " stdin = subprocess.PIPE"上面的方法适用于OSGeo4W64中的某些命令行工具,但不是全部。它适用于gdal_translate,但不适用于pdal翻译。不知道为什么;(

我的解决方案:

OSGeo4Wenv = r' CALL" C:/OSGeo4W64/bin/o4w_env.bat" '

pdal_translate_String = r' c:/ OSGeo4W64 / bin / pdal translate c:\ inputFile c:\ outputFile radiusoutlier --filters.radiusoutlier.min_neighbors = 2 --filters.radiusoutlier.radius = 8.0 --filters.radiusoutlier .extract =真'

Cmd = str(OSGeo4Wenv)+' &安培; ' + STR(pdal_translateCmd)

shell = subprocess.call(Cmd,stdout = None,shell = True)

发生了什么事? 1)通过调用" OSGeo4Wenv"打开shell并设置OSGeo4W环境。这通常由OSGeo4W.bat文件调用。如果没有这个,命令行程序就不知道在哪里寻找库。

2)然后将pdal_translate命令发送到dos shell,因为在Windows中,多个命令可以通过"&"符号。我使用python 2.7的.call方法。它具有等待过程结束的优点。如果您使用多处理map.pool方法同时启动多个进程,那就太好了。

希望这能帮到别人! 尼古拉斯