首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >无法从python脚本(grass 6.4、Python2.7、win7)运行grass工具

无法从python脚本(grass 6.4、Python2.7、win7)运行grass工具
EN

Stack Overflow用户
提问于 2015-05-31 19:58:15
回答 1查看 1.2K关注 0票数 1

我是GRASS的新手,我还不能入门。我正在尝试编写一个python脚本,它将调用grass工具(在这一点上,什么工具并不重要)我交互地创建了位置和地图集,并设置了所有的定义。我仍然不能让'grass.gisenv()‘给出{}以外的任何输出。

我的代码:

代码语言:javascript
复制
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()

我没有得到任何错误。仅"{}“。

请帮帮我

EN

回答 1

Stack Overflow用户

发布于 2015-06-01 06:13:36

有一些方法可以改进你的代码,例如,添加到环境变量而不是设置它们:

代码语言:javascript
复制
os.environ['PATH'] += os.pathsep + os.path.join(gisbase, 'bin')

然后,GISRC变量应该指向一个临时文件,而不是用户设置目录中的文件(以防您希望以普通用户身份运行GRASS会话)。但不管怎样,我建议用一个新的脚本或方法重新开始。

首先,如果可能的话,使用GRASS GIS 7。7.0.0版本是几个月前发布的,它既可以作为独立的微软视窗操作系统,也可以作为OSGeo4W的一部分。例如,您可能会得到更好的错误消息。

第二,回顾related wiki page。它包含了一个详细的指南,需要对大量的代码样本进行哪些操作。下面是其中一个基本内容的摘录(仅适用于MS Windows ):

代码语言:javascript
复制
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可执行文件的命令行中指定脚本的可能性。调用可能如下所示:

代码语言:javascript
复制
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进程将对其进行检查并执行变量中指定的脚本。

代码语言:javascript
复制
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图标的属性中找到)。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/30557132

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档