1

让我重新表述我之前的问题。我刚刚在 ArcGIS 中使用 pythong 作为脚本语言创建了一个工具。该工具使用 subprocess.popen 执行(运行)外部程序。当我从 ArcGSIS 运行该工具时,会出现一个仅显示以下内容的窗口。

Executing: RunFLOW C:\FLOW C:\FLOW\FLW.bat
Start Time: Mon Nov 30 16:50:37 2009
Running script RunFLOW...
Completed script RuFLOW...
Executed (RunFLOW) successfully.
End Time: Mon Nov 30 16:50:48 2009 (Elapsed Time: 11.00 seconds)

脚本如下

# Import system modules
import sys, string, os, arcgisscripting, subprocess
# Create the Geoprocessor object
gp = arcgisscripting.create()
# Read the parameter values:
#  1: input workspace
prj_fld = gp.GetParameterAsText(0)
Flow_bat = gp.GetParameterAsText(1)
os.chdir(prj_fld)
p=subprocess.Popen(Flow_bat,shell=True,stdout=subprocess.PIPE)
stdout_value = p.communicate()[0]
print '\tstdout:', repr(stdout_value)

当我从命令窗口运行相同的程序时,它会打印一个充满信息的屏幕(日期、迭代次数等)。除了现在正在打印的内容之外,我还想在从 ArcGIS 运行模型后出现的窗口中查看所有这些信息。我尝试了打印、交流、冲洗,但无法做到。有什么建议么?

当我现在运行脚本时,它会运行可执行文件,但会出现如下错误

ERROR 999998: There are no more files.

谢谢

4

2 回答 2

0

我对ArcGIS一无所知,所以我可能在这里在黑暗中拍摄,但是......如果你想要stdout,你通常不想要这个communicate()方法。你想要这样的东西:

p=subprocess.Popen(Flow_bat,shell=True,stdout=subprocess.PIPE)
stdout_value = p.stdout.read()

communicate()方法用于与进程交互。从文档中:

Interact with process: Send data to stdin.  Read data from stdout
and stderr, until end-of-file is reached.  Wait for process to
terminate.

我猜测当 ArcGIS 运行stdin未连接的脚本并导致脚本由于某种原因退出时。

于 2009-12-01T02:04:08.993 回答
0

我不确定您是否知道这一点,但我使用:

gp.AddMessage('blah blah')

使消息出现在 ArcGIS 处理窗口中。它是地理处理器对象的一种方法,是您在 Python 中导入以访问 ArcGIS 引擎的库。如果您正在执行任何地理处理,您应该已经导入了这个库。

于 2009-12-09T20:20:27.373 回答