Буферизация печати Python - PullRequest
       10

Буферизация печати Python

1 голос
/ 01 декабря 2009

Позвольте мне перефразировать мой предыдущий вопрос. Я только что создал инструмент в 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.

Спасибо

Ответы [ 2 ]

0 голосов
/ 09 декабря 2009

Я не уверен, знаете ли вы об этом или нет, но я использую:

gp.AddMessage('blah blah')

чтобы сообщения появлялись в окне обработки ArcGIS. Это метод объекта геопроцессора, библиотеки, которую вы импортируете в Python для доступа к движку ArcGIS. Вы уже импортировали бы эту библиотеку, если выполняете какую-либо геообработку.

0 голосов
/ 01 декабря 2009

Я ничего не знаю о ArcGIS, поэтому я могу снимать в темноте здесь, но ... если вы хотите стандартный вывод, вам обычно не нужен метод 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 не подключен и заставляет скрипт по какой-то причине завершаться.

...