Python 子进程通信
我正在尝试运行一个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: [Error 2] 系统找不到指定的文件”。
不过,如果我保持这个打开的命令提示符,然后手动输入“'gdal2tiles -p raster -z 0-1 new.jpg abc'”,它就能像我想的那样工作。希望能得到一些帮助,谢谢!
2 个回答
对于那些还在琢磨这个问题的朋友们,我找到了一些信息。上面提到的“stdin=subprocess.PIPE”方法在OSGeo4W64的一些命令行工具中有效,但并不是所有工具都能用。比如,它在gdal_translate中可以用,但在pdal translate中就不行。我也不太明白为什么;
我的解决方案:
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=true'
Cmd = str(OSGeo4Wenv)+' & '+str(pdal_translateCmd)
shell = subprocess.call(Cmd, stdout=None, shell=True)
发生了什么呢? 1) 首先打开一个命令行窗口,并通过调用“OSGeo4Wenv”来设置OSGeo4W环境。这个通常是通过OSGeo4W.bat文件来调用的。如果不这样做,命令行程序就不知道去哪里找需要的库。
2) 然后,pdal_translate命令被发送到DOS命令行,因为在Windows中,可以用“&”符号来分隔多个命令。我使用的是Python 2.7的.call方法。这个方法的好处是它会等到进程结束后再继续。这在你使用多进程的map.pool方法同时启动多个进程时特别好。
希望这能帮助到其他人! Nicolas
试试这个:
check_call('gdal2tiles -p raster -z 0-1 new.jpg abc', shell=True)
shell=True
会改变 在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""
字符串。这样做是为了避免在路径中需要转义反斜杠。