【问题标题】:Python subprocess communicationPython子进程通信
【发布时间】:2014-10-14 18:04:57
【问题描述】:

我正在尝试运行将打开命令提示符的 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'”,那么它将按照我的意愿工作。帮助会很好,谢谢!

【问题讨论】:

  • Windows 让它...有趣。通常,忽略平台,如果您希望能够将标准输入提供给您的进程,则一定要使用 stdin=subprocess.PIPE
  • 也就是说——如果您实际上并不需要 OSGeo4W.bat,您是否尝试过使用subprocess.Popen(['gdal2tiles', '-p', 'raster', '-z', '0-1', 'new.jpg', 'abc'], shell=False)?如果所有批处理文件都在设置您的 PATH,您可以将其作为参数包含在脚本中,或者完全限定可执行文件名称(r'C:\OSGeo4W64\bin\gdal2tiles' 等)。
  • @CharlesDuffy:命令字符串是 Windows 上的本机接口。这里没有必要将其转换为列表。

标签: python command-line subprocess


【解决方案1】:

试试:

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"" 字面量。必须避免转义路径中的反斜杠。

【讨论】:

  • 我想使用 OSgeo4W.bat 制作的环境,我尝试了你的第二段代码,它快速打开命令行并关闭,并且没有创建应有的输出文件夹。然后我尝试了你的第一段代码,它不适用于这个调用 subprocess.check_call('gdal2tiles -p raster -z 0-1 new.jpg abc', shell=True) 但我没有运行 gdal 我运行了一个简单的 python 脚本这已经奏效了。当我尝试 gdal2tiles 时,出现此错误 命令 'gdal2tiles -p raster -z 0-1 new.jpg abc' 返回非零退出状态 1
  • @BFlint:在控制台(命令行)中运行 python 脚本。编辑您的问题并为失败的代码提供完整的回溯。如果将 OSGeo4W.batgdal2tiles 两个命令都写入批处理文件并运行它会发生什么?
  • 实际上,我在想...我正在使用 OGGeo4W.bat 启动一个子进程,该批处理文件是做什么的,它会启动一个带有预加载路径的命令行。所以当我告诉它进行通信时,它是将我的命令发送到命令行,还是打开命令行的批处理文件(我假设它没有做任何事情)
【解决方案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 翻译 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) 打开shell,调用“OSGeo4Wenv”设置OSGeo4W环境。这通常由 OSGeo4W.bat 文件调用。没有这个,命令行程序不知道在哪里寻找库。

2) pdal_translate 命令随后被发送到dos shell,因为在Windows 中,多个命令可以用“&”符号分隔。我使用 python 2.7 的 .call 方法。它的优点是等待进程结束。如果您使用 multiprocessing map.pool 方法同时启动多个进程,那就太好了。

希望这对其他人有所帮助! 尼古拉斯

【讨论】:

    猜你喜欢
    • 2012-07-07
    • 2011-01-09
    • 1970-01-01
    • 1970-01-01
    • 2017-07-22
    • 1970-01-01
    • 1970-01-01
    • 2014-03-29
    • 2018-05-13
    相关资源
    最近更新 更多