Python 子进程通信

0 投票
2 回答
1647 浏览
提问于 2025-04-27 13:47

我正在尝试运行一个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 个回答

-1

对于那些还在琢磨这个问题的朋友们,我找到了一些信息。上面提到的“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

2

试试这个:

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"" 字符串。这样做是为了避免在路径中需要转义反斜杠。

撰写回答