我是GRASS的新手,我还不能入门。我正在尝试编写一个python脚本,它将调用grass工具(在这一点上,什么工具并不重要)我交互地创建了位置和地图集,并设置了所有的定义。我仍然不能让'grass.gisenv()‘给出{}以外的任何输出。
我的代码:
import sys
import os
os.environ['GISBASE'] = r'C:\OSGeo4W\apps\grass\grass-6.4.4'
os.environ['GISRC']= r'C:\Users\USER\AppData\Roaming\GRASS6\grassrc6'
os.environ['LD_LIBRARY_PATH']= r'C:\OSGeo4W\apps\grass\grass-6.4.4\lib'
os.environ['PATH']= r'C:\OSGeo4W\apps\grass\grass-6.4.4\etc;C:\OSGeo4W\apps\grass\grass-6.4.4\etc\python;C:\OSGeo4W\apps\grass\grass-6.4.4\lib;C:\OSGeo4W\apps\grass\grass-6.4.4\bin;C:\OSGeo4W\apps\grass\grass-6.4.4\extralib;C:\OSGeo4W\apps\grass\grass-6.4.4\msys\bin;C:\Python27;'
os.environ['PYTHONLIB']= r'C:\OSGeo4W\apps\Python27'
os.environ['PYTHONPATH']= r'C:\OSGeo4W\apps\grass\grass-6.4.4\etc\python'
sys.path.append(os.path.join(os.environ['GISBASE'], 'etc', 'python'))
gisbase = os.environ['GISBASE'] #= "/usr/local/src/grass_trunk/dist.x86_64-unknown-linux-gnu"
gisdbase = os.path.join(r'C:\Users\USER\Documents', "grassdata")
location = "ISRAEL"
mapset = "PERMANENT"
import grass.script as grass
import grass.script.setup as gsetup
gsetup.init(gisbase,gisdbase, location, mapset)
print grass.gisenv()我没有得到任何错误。仅"{}“。
请帮帮我
发布于 2015-06-01 06:13:36
有一些方法可以改进你的代码,例如,添加到环境变量而不是设置它们:
os.environ['PATH'] += os.pathsep + os.path.join(gisbase, 'bin')然后,GISRC变量应该指向一个临时文件,而不是用户设置目录中的文件(以防您希望以普通用户身份运行GRASS会话)。但不管怎样,我建议用一个新的脚本或方法重新开始。
首先,如果可能的话,使用GRASS GIS 7。7.0.0版本是几个月前发布的,它既可以作为独立的微软视窗操作系统,也可以作为OSGeo4W的一部分。例如,您可能会得到更好的错误消息。
第二,回顾related wiki page。它包含了一个详细的指南,需要对大量的代码样本进行哪些操作。下面是其中一个基本内容的摘录(仅适用于MS Windows ):
import os
import sys
import subprocess
# path to the GRASS GIS launch script
grass7bin = r'C:\OSGeo4W\bin\grass70svn.bat'
# uncomment when using standalone WinGRASS installer
# grass7bin = r'C:\Program Files (x86)\GRASS GIS 7.0.0\grass70.bat'
# query GRASS 7 itself for its GISBASE
startcmd = [grass7bin, '--config', 'path']
p = subprocess.Popen(startcmd, shell=False,
stdout=subprocess.PIPE, stderr=subprocess.PIPE)
out, err = p.communicate()
if p.returncode != 0:
print >>sys.stderr, "ERROR: Cannot find GRASS GIS 7 start script (%s)" % startcmd
sys.exit(-1)
gisbase = out.strip('\n\r')
# this could be replaced by using the right gisbase
# directly instead of the executable
# Set GISBASE environment variable
os.environ['GISBASE'] = gisbase
# define GRASS-Python environment
gpydir = os.path.join(gisbase, "etc", "python")
sys.path.append(gpydir)
# data
gisdb = os.path.join(os.path.expanduser("~"), "Documents/grassdata")
# specify (existing) location and mapset
location = "nc_spm_08"
mapset = "user1"
# import GRASS Python bindings
import grass.script as gscript
import grass.script.setup as gsetup
# launch session
gsetup.init(gisbase,
gisdb, location, mapset)但是,请注意,在Python中调用GRASS GIS功能(模块和Python库)的最佳方式是从GRASS会话中调用。因此,通常的工作流程是编写一个依赖于所设置的正确环境的脚本,即它立即调用GRASS功能。然后启动GRASS,它为您提供了正确的环境- GRASS会话,脚本可以在其中运行。
此外,GRASS GIS的开发版本中还包含a new option。如果你正在做一些非生产开发,或者你正在写一些实验性的东西,你可以尝试使用开发版本的每日构建(Subversion主干,未来的7.1),它包含了在GRASS GIS可执行文件的命令行中指定脚本的可能性。调用可能如下所示:
grass7bin = r'C:\Program Files (x86)\GRASS GIS 7.0.0\grass70.bat'
gisdb = os.path.join(os.path.expanduser("~"), "Documents/grassdata")
location = "nc_spm_08"
mapset = "user1"
full_mapset = os.path.join(gisdb, location, mapset)
cmd = [grass7bin, full_mapset, '--exec', 'your_script.py']
p = subprocess.Popen(cmd, shell=False,
stdout=subprocess.PIPE, stderr=subprocess.PIPE)
out, err = p.communicate()上面的解决方案的优点是,您可以在Linux和Mac上正确地锁定Mapsets,并从正确设置GRASS环境开始,而不需要做太多的工作。你只需要知道可执行文件的路径,或者让可执行文件"on PATH“。
然后有一个类似于前一个的选项,它可以在旧版本中工作。您可以设置GRASS_BATCH_JOB环境变量。GRASS进程将对其进行检查并执行变量中指定的脚本。
grass7bin = r'C:\Program Files (x86)\GRASS GIS 7.0.0\grass70.bat'
gisdb = os.path.join(os.path.expanduser("~"), "Documents/grassdata")
location = "nc_spm_08"
mapset = "user1"
full_mapset = os.path.join(gisdb, location, mapset)
os.environ['GRASS_BATCH_JOB'] = 'your_script.py'
cmd = [grass7bin, full_mapset]
p = subprocess.Popen(cmd, shell=False,
stdout=subprocess.PIPE, stderr=subprocess.PIPE)
out, err = p.communicate()
# delete the variable just to be sure
# but using separate env would be more elegant
del os.environ['GRASS_BATCH_JOB']与上面的选项(将脚本作为参数传递)不同,您不能将参数传递给被调用的脚本,也不能直接调用GRASS模块。
最后,您可以在系统中设置环境变量,从而使GRASS会话始终可用。然后,只要提供了正确的GISRC变量和文件,GRASS模块就可以像普通程序一样运行。此选项可能会导致许多问题,例如,当使用两个版本的GRASS GIS时,因此不建议使用此选项。但是,可以在这两者之间做一些事情:将GRASS可执行文件添加到路径中,然后您应该能够像在Linux上一样使用grass70调用GRASS (路径可以在GRASS GIS图标的属性中找到)。
https://stackoverflow.com/questions/30557132
复制相似问题