Проблема работы с GRASS 7.0.4 из Python

kvesda
Новоприбывший
Сообщения: 9
Зарегистрирован: 15 июн 2016, 15:02
Репутация: 1

Проблема работы с GRASS 7.0.4 из Python

Сообщение kvesda » 15 июн 2016, 15:33

Столкнулся с проблемой, которую никак не могу одолеть.
Установил OSGeo4W64 в C:\OSGeo4W64
Установил дополнительно Python в C"\Python27
GRASS - версии 7.0.4.

Написал тестовый скрипт D:\my_grass.py, который создает временный location (в конце скрипта он удаляется), инициализирует grass.script, и пытается сделать самую простую команду - выдачу сообщения gscript.message('--- GRASS GIS 7 ----')
До этого места - все работает. Но при попытке выполнить gscript.message - появляется сообщение об ошибке.

Вот сам скрипт:

Код: Выделить всё

import os
import sys
import subprocess
import shutil
import binascii
import tempfile

OSGeo4W64Dir = r'C:\OSGeo4W64'
grassVersionDir = 'grass-7.0.4'
grassBatFileName = 'grass70.bat'
grassBatFile = os.path.join( OSGeo4W64Dir, 'bin', grassBatFileName )

GISBASEPath = os.environ['GISBASE'] = os.path.join(OSGeo4W64Dir, 'apps', 'grass', grassVersionDir)
LD_LIBRARY_PATH = os.environ['LD_LIBRARY_PATH'] = os.path.join(GISBASEPath, 'lib')
PYTHONLIB = os.environ['PYTHONLIB'] = r'C:\Python27'
PYTHONPATH = os.environ['PYTHONPATH'] = os.path.join(GISBASEPath, 'etc', 'python')
sys.path.append(PYTHONPATH) # !!!!
GRASS_SH = os.environ['GRASS_SH'] = os.path.join(OSGeo4W64Dir, 'apps', 'msys', 'bin', 'sh.exe')

###############
GISBASEBinPath = os.path.join(GISBASEPath, 'bin')
GISBASEBinScripts = os.path.join(GISBASEPath, 'scripts')
sys.path.append(GISBASEPath)
sys.path.append(GISBASEBinPath)
sys.path.append(PYTHONLIB)
sys.path.append(LD_LIBRARY_PATH)
sys.path.append(GISBASEBinScripts)
os.environ['PATH'] += GISBASEPath
os.environ['PATH'] += GISBASEBinPath
os.environ['PATH'] += PYTHONPATH
os.environ['PATH'] += PYTHONLIB
os.environ['PATH'] += LD_LIBRARY_PATH
os.environ['PATH'] += GISBASEBinScripts
###############

gisdb = os.path.join(tempfile.gettempdir(), 'grassdata')
os.environ['GISDBASE'] = gisdb
try:
	os.stat(gisdb)
except:
	os.mkdir(gisdb)
 
string_length = 16
location = binascii.hexlify(os.urandom(string_length))
mapset   = 'PERMANENT'
location_path = os.path.join(gisdb, location)

myepsg = '3044'
startcmd = grassBatFile + ' -c epsg:' + myepsg + ' -e ' + location_path

print startcmd
p = subprocess.Popen(startcmd, shell=True, 
                     stdout=subprocess.PIPE, stderr=subprocess.PIPE)
out, err = p.communicate()
if p.returncode != 0:
	print >> sys.stderr, 'ERROR: %s' % err
	print >> sys.stderr, 'ERROR: Cannot generate location (%s)' % startcmd
	sys.exit(-1)
else:
	print 'Created location %s' % location_path

import grass.script as gscript
import grass.script.setup as gsetup

gsetup.init(GISBASEPath, gisdb, location, mapset)
gscript.message('--- GRASS GIS 7 ----')
shutil.rmtree(location_path)
sys.exit(0)
Вот - сообщение об ошибке:

Код: Выделить всё

C:\OSGeo4W64\bin\grass70.bat -c epsg:3044 -e c:\users\vadimk\appdata\local\temp\grassdata\7f9cb7c41498f1dab61358624241de85
Created location c:\users\vadimk\appdata\local\temp\grassdata\7f9cb7c41498f1dab61358624241de85

Traceback (most recent call last):
  File "D:\my_grass.py", line 110, in <module>
    gscript.message('--- GRASS GIS 7: Current GRASS GIS 7 environment:')
  File "C:\OSGeo4W64\apps\grass\grass-7.0.4\etc\python\grass\script\core.py", line 548, in message
    run_command("g.message", flags=flag, message=msg, errors='ignore')
  File "C:\OSGeo4W64\apps\grass\grass-7.0.4\etc\python\grass\script\core.py", line 393, in run_command
    ps = start_command(*args, **kwargs)
  File "C:\OSGeo4W64\apps\grass\grass-7.0.4\etc\python\grass\script\core.py", line 356, in start_command
    if debug_level() > 0:
  File "C:\OSGeo4W64\apps\grass\grass-7.0.4\etc\python\grass\script\core.py", line 1519, in debug_level
    _debug_level = int(gisenv().get('DEBUG', 0))
  File "C:\OSGeo4W64\apps\grass\grass-7.0.4\etc\python\grass\script\core.py", line 935, in gisenv
    s = read_command("g.gisenv", flags='n')
  File "C:\OSGeo4W64\apps\grass\grass-7.0.4\etc\python\grass\script\core.py", line 446, in read_command
    return handle_errors(returncode, stdout, args, kwargs)
  File "C:\OSGeo4W64\apps\grass\grass-7.0.4\etc\python\grass\script\core.py", line 313, in handle_errors
    returncode=returncode)
CalledModuleError: Module run None ['g.gisenv', '-n'] ended with error
Process ended with non-zero return code -1073741701. See errors in the (error) output.
Не срабатывают никакие команды, типа

Код: Выделить всё

print gscript.gisenv()
in_region = gscript.region()
и т.д.
Т.е. grass.script вообще не работает.
Подскажите, в чем может быть проблема?

KolesovDmitry
Гуру
Сообщения: 810
Зарегистрирован: 22 авг 2007, 14:58
Статьи: 18
Проекты: 4
Репутация: 122
Откуда: Казань

Re: Проблема работы с GRASS 7.0.4 из Python

Сообщение KolesovDmitry » 17 июн 2016, 11:10

Пара вопросов для диагностики:
* Запускается ли GUI с консолью Python?
* Выполняются ли в консоли Python команды, которые вы вызываете в скрипте?

Если ответ на оба вопроса -- "Да", то скорее всего у вас в скрипте как-то не так прописаны пути импорта, тогда нужно посмотреть, откуда импортирует GUI-шный Python свои библиотеки (и вообще тот ли это питон, который выполняет ваш скрипт). Если ответ "Нет", то, вероятно, сам GRASS установлен криво и нужно разбираться, почему.

kvesda
Новоприбывший
Сообщения: 9
Зарегистрирован: 15 июн 2016, 15:02
Репутация: 1

Re: Проблема работы с GRASS 7.0.4 из Python

Сообщение kvesda » 17 июн 2016, 16:04

Спасибо за попытку помочь.
KolesovDmitry писал(а):Пара вопросов для диагностики:
* Запускается ли GUI с консолью Python?
* Выполняются ли в консоли Python команды, которые вы вызываете в скрипте?
И "Да", и "Нет". И в GUI, и через консоль, командой python d:\my_grass.py, скрипт отрабатывает (создается временная база, проходит инициализация grass.script), А вот дальше... Появляется сообщение с ошибками, которое я приводил выше.
KolesovDmitry писал(а):Пара вопросов для диагностики:
Если ответ на оба вопроса -- "Да", то скорее всего у вас в скрипте как-то не так прописаны пути импорта, тогда нужно посмотреть, откуда импортирует GUI-шный Python свои библиотеки (и вообще тот ли это питон, который выполняет ваш скрипт).
В переменной скрипта я задавал указание на тот Питон, который устанавливается вместе с OSGeo4W64 (QGis, GRASS, gdal и т.д.) следующим образом:

Код: Выделить всё

PYTHONLIB = os.environ['PYTHONLIB'] = os.path.join(OSGeo4W64Dir, 'apps', 'Python27')
Эффект такой же, как и при

Код: Выделить всё

PYTHONLIB = os.environ['PYTHONLIB'] = r'C:\Python27
когда используется "сторонний" Python. загруженный с сайта автора Питона,
т.е. - не работает grass.script, хотя и инициализируется.
Насчет того, что GRASS мог установиться некорректно: Я пробовал на компьютере сотрудника запускать скрипт - точно такая же ситуация.
Думаю, что такая проблема на Windows 7. На Linux пока нет возможности попробовать...

Ariki
Гуру
Сообщения: 730
Зарегистрирован: 12 янв 2011, 22:40
Проекты: 1
Репутация: 303
Ваше звание:

Re: Проблема работы с GRASS 7.0.4 из Python

Сообщение Ariki » 17 июн 2016, 16:46

А сам скрипт вы запускаете сторонним интерпретатором Python или тем, который в OSGeo4W? Может, официальная сборка Python бинарно несовместима с библиотеками GRASS из-за того, что они собраны разными версиями компилятора? Или вы вообще 32-битный Python установили?

KolesovDmitry
Гуру
Сообщения: 810
Зарегистрирован: 22 авг 2007, 14:58
Статьи: 18
Проекты: 4
Репутация: 122
Откуда: Казань

Re: Проблема работы с GRASS 7.0.4 из Python

Сообщение KolesovDmitry » 17 июн 2016, 21:26

Все-таки попробуйте выполнить в GUI в питоновской консоли вашу команду:

Код: Выделить всё

import grass.script as my_gscript
my_gscript.message('--- GRASS GIS 7 ----')
Она выполняется без ошибок?

Александр Мурый
Гуру
Сообщения: 5171
Зарегистрирован: 26 сен 2009, 16:26
Статьи: 3
Проекты: 5/1
Репутация: 778
Ваше звание: званий не имею
Откуда: Москва

Re: Проблема работы с GRASS 7.0.4 из Python

Сообщение Александр Мурый » 19 июн 2016, 14:06

Откуда появилась переменная окружения PYTHONLIB? Такую не используют, насколько мне известно. Видимо, вы имели в виду переменную PYTHONHOME?
Редактор материалов, модератор форума

kvesda
Новоприбывший
Сообщения: 9
Зарегистрирован: 15 июн 2016, 15:02
Репутация: 1

Re: Проблема работы с GRASS 7.0.4 из Python

Сообщение kvesda » 20 июн 2016, 09:21

KolesovDmitry писал(а):Все-таки попробуйте выполнить в GUI в питоновской консоли вашу команду:

Код: Выделить всё

import grass.script as my_gscript
my_gscript.message('--- GRASS GIS 7 ----')
Она выполняется без ошибок?
Запуск этих 2-х команд в GUI GRASS 7.04 на вкладке Python shell, после

Код: Выделить всё

my_gscript.message('--- GRASS GIS 7 ----')
выдает сообщение:

kvesda
Новоприбывший
Сообщения: 9
Зарегистрирован: 15 июн 2016, 15:02
Репутация: 1

Re: Проблема работы с GRASS 7.0.4 из Python

Сообщение kvesda » 20 июн 2016, 09:26

Александр Мурый писал(а):Откуда появилась переменная окружения PYTHONLIB? Такую не используют, насколько мне известно. Видимо, вы имели в виду переменную PYTHONHOME?
Я взял эту переменную PYTHONLIB из прорабатываемых источников:
http://gis-lab.info/qa/grass-external-scripting.html
http://gis.stackexchange.com/questions/ ... 0160#90160
К сожалению, замена PYTHONLIB на PYTHONHOME в

Код: Выделить всё

PYTHONLIB = os.environ['PYTHONLIB'] = r'C:\Python27' 
ничего не изменила.

kvesda
Новоприбывший
Сообщения: 9
Зарегистрирован: 15 июн 2016, 15:02
Репутация: 1

Re: Проблема работы с GRASS 7.0.4 из Python

Сообщение kvesda » 20 июн 2016, 09:35

Ariki писал(а):А сам скрипт вы запускаете сторонним интерпретатором Python или тем, который в OSGeo4W? Может, официальная сборка Python бинарно несовместима с библиотеками GRASS из-за того, что они собраны разными версиями компилятора? Или вы вообще 32-битный Python установили?
Запускаю скрипт сторонним Питоном, установленным на диске С по пути c:\Python27\ Сам Питон качал с сайта Питона. Там вообще нет указаний для какой разрядности системы качается Питон.
В самой сборке c:\OSGeo4W64 в папке bin есть python.exe, но он при его запуске вообще без каких-либо параметров выдает сообщение:

Код: Выделить всё

ImportError: No module named site
OSGeo4W64 устанавливал МАКСИМАЛЬНО ПОЛНУЮ (многое - вообще лишнее и ненужное), чтобы ничего важного не пропустить.

KolesovDmitry
Гуру
Сообщения: 810
Зарегистрирован: 22 авг 2007, 14:58
Статьи: 18
Проекты: 4
Репутация: 122
Откуда: Казань

Re: Проблема работы с GRASS 7.0.4 из Python

Сообщение KolesovDmitry » 20 июн 2016, 09:40

kvesda писал(а): Запуск этих 2-х команд в GUI GRASS 7.04 на вкладке Python shell, после

Код: Выделить всё

my_gscript.message('--- GRASS GIS 7 ----')
выдает сообщение:
Если при этом в консоли пишется само сообщение, то версию о том, что виновата неверная установка GRASS, отбрасываем.

И это радует. Поскольку, видимо, дело все-таки в путях импорта библиотек питон и/или переменных окружения. Теперь нужно "вломиться" в GRASSовский GUIшный питон, посмотреть, какие переменные и пути прописаны в нем, и воспроизвести их в вашем скрипте. Изучите вывод команд в GRASS GUI, посмотрите есть ли отличия от ваших путей:

Код: Выделить всё

print sys.path
print os.environ
(Возможно, это не все и есть еще питоновские переменные, в которых хранятся пути и окружение. Но начните с этих)

kvesda
Новоприбывший
Сообщения: 9
Зарегистрирован: 15 июн 2016, 15:02
Репутация: 1

Re: Проблема работы с GRASS 7.0.4 из Python

Сообщение kvesda » 20 июн 2016, 10:11

Спасибо за идею и совет! Сейчас буду исследовать... Потом напишу результат.

Ariki
Гуру
Сообщения: 730
Зарегистрирован: 12 янв 2011, 22:40
Проекты: 1
Репутация: 303
Ваше звание:

Re: Проблема работы с GRASS 7.0.4 из Python

Сообщение Ariki » 20 июн 2016, 11:45

kvesda писал(а):Запускаю скрипт сторонним Питоном, установленным на диске С по пути c:\Python27\ Сам Питон качал с сайта Питона. Там вообще нет указаний для какой разрядности системы качается Питон.
https://www.python.org/downloads/release/python-2711/
Там отдельные версии для x86 и x86-64. По ссылке с главной страницы, судя по имени файла, качается версия для x86.
Но вы можете проверить, запустив командный интерфейс интерпретатора (C:\Python27\python.exe): он в первой строчке выведет информацию о сборке.

kvesda
Новоприбывший
Сообщения: 9
Зарегистрирован: 15 июн 2016, 15:02
Репутация: 1

Re: Проблема работы с GRASS 7.0.4 из Python

Сообщение kvesda » 20 июн 2016, 12:06

Ariki писал(а):https://www.python.org/downloads/release/python-2711/
Там отдельные версии для x86 и x86-64. По ссылке с главной страницы, судя по имени файла, качается версия для x86.
Но вы можете проверить, запустив командный интерфейс интерпретатора (C:\Python27\python.exe): он в первой строчке выведет информацию о сборке.
У меня оказалась x86 сборка. Сейчас поставлю x64 по вашей ссылке...

kvesda
Новоприбывший
Сообщения: 9
Зарегистрирован: 15 июн 2016, 15:02
Репутация: 1

Re: Проблема работы с GRASS 7.0.4 из Python

Сообщение kvesda » 20 июн 2016, 12:42

Все заработало!
Самое интересное - только применение ОДНОВРЕМЕННО ВСЕХ советов помогло запустить скрипт.
Т.е. пришлось переставить Python x64 сборки.
И прописать в скрипт строку:

Код: Выделить всё

os.environ['PATH'] += 'C:\\OSGeo4W64\\apps\\Python27\\Scripts;C:\\OSGeo4W64\\bin'
как это было указано в переменных GRASS (остальные переменные из окружения GRASS не нужны).
Эта переменная PATH была определена по командам в GUI GRASS шела Питона:

Код: Выделить всё

print sys.path
print os.environ
Все заработало.
Огромное спасибо всем, кто отозвался и написал свои идеи!

Александр Мурый
Гуру
Сообщения: 5171
Зарегистрирован: 26 сен 2009, 16:26
Статьи: 3
Проекты: 5/1
Репутация: 778
Ваше звание: званий не имею
Откуда: Москва

Re: Проблема работы с GRASS 7.0.4 из Python

Сообщение Александр Мурый » 20 июн 2016, 13:03

Если запускать из шеллов OSGeo4W (MSYS Shell, OSGeo4W Shell), то скрипт работает и в первоначальном варианте.
Проверил: и без строки "os.environ['PATH'] ... " в стороннем Питоне (у меня WinPython-32bit-2.7.10.3) всё работает.
Редактор материалов, модератор форума

Ответить

Вернуться в «GRASS»

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и 3 гостя