GRASS and Python/ko: Difference between revisions
⚠️Ghlimassuh (talk | contribs) |
⚠️Ghlimassuh (talk | contribs) |
||
(One intermediate revision by the same user not shown) | |||
Line 89: | Line 89: | ||
export PYTHONPATH="$PYTHONPATH:$GISBASE/etc/python" | export PYTHONPATH="$PYTHONPATH:$GISBASE/etc/python" | ||
=== 파이션 환경하에서 | === 파이션 환경하에서 외부명령문 실행 === | ||
파이션 환경하에서 외부명령어 실행에 대하여 배우려면, 다음을 참조하십시오: | 파이션 환경하에서 외부명령어 실행에 대하여 배우려면, 다음을 참조하십시오: | ||
Line 96: | Line 96: | ||
구 os.* 함수를 피하십시오. 섹션 17.1.3의 나열 항목은 Popen() 인텨페이스 사용과 유사하며, 윈도우즈 경우즍 더 강력합니다. | 구 os.* 함수를 피하십시오. 섹션 17.1.3의 나열 항목은 Popen() 인텨페이스 사용과 유사하며, 윈도우즈 경우즍 더 강력합니다. | ||
=== | === 파이션 확장프로그램의 검정과 인스톨Testing and installing Python extensions === | ||
==== | ==== 수정 ==== | ||
스크립트가 수행가능한지 확인하십시오: | |||
chmod +x /path/to/my.extension.py | chmod +x /path/to/my.extension.py | ||
During | During development개발도중, 파이션 스크립트를 파이션 수정자로 고칠 수 있습니다. a Python script can be debugged using the Python Debugger (pdb): | ||
python -m pdb /path/to/my.extension.py input=my_input_layer output=my_output_layer option=value -f | python -m pdb /path/to/my.extension.py input=my_input_layer output=my_output_layer option=value -f |
Latest revision as of 08:51, 4 June 2013
파이선 분과회
파이선 분과회 단체들(Python Special Interest Groups)은 파이선의 개발, 개선, 상세 관리를 위해 상호 노력합니다. 각각의 분과회는 분과회의, 조정자, 메일 리스트, 파이선 웹사이트의 디렉토리를 가집니다. 분과회 회원권은 비형식적이며 SIG 메일링 리스트에 등록하는 경우 자동으로 획득됩니다. 어떤 분이라도 분과회에 가입할 수 있으며, 분과회의 메일링 목록을 이용하여 개발자 회의에 참가할 수 있습니다. 아래 연걸사이트에서 현재 활동중인 분과회 회원들의 주소와 그들이 소유한 리소스에 접근할 수 있습니다.
더 상세한 사항은 다음 사이트에서 참조 http://www.python.org/community/sigs/
GRASS 환경하에서 파이선 스크립트 작성
파이선은 셀스크립트보다 강력하며 C 언어에 비하여 매우 쉽습니다. 파이선 스크립트는 g.parser로 처리할 수 있는 간단한 모듈 정의를 포함합니다. 아래에 그 예제가 있습니다. 이러한 방법을 이용하면 별도 프로그램 없이 GUI를 구현할 수 있습니다. 또한 입력을 체크하고 외형, 도움말 쪽을 자동으로 작성할 수 있습니다. 이에 더하여 이러한 과정은 그라스 메시지 번역시스템에 연결됩니다. 스크립트 ("scripting")용 라이버리를 "grass.script", 로 다음과 같이 사용할 수 있습니다. 평범한 사용 예로:
import grass.script as grass
관련 파일이 $GISBASE/etc/python/grass/script/*.py 에 있습니다. 더 자세한 이해를 원한다면 다음을 이용하십시오.
노트: C 강점을 이용하여야만 하는 코드을 작성하려면, 여러분은 다음 사이트the Python "ctypes" interface.를 통하여 GRASS C 라이버러리 함수를 사용할 수 있습니다.
Python script editor파이선 구문 편집기
GRASS 6.4.3+의 레이어관리 wxGUI 는 파이선 셀을 가지고 있어 wxGUI환경하에서 사용자가 직접 파이선 구문을 작성할 수 있게 합니다.
GRASS 파이선 구문 라이버러리 사용
당신은 그라스 세션중에서 쉽게 파이선 구문을 수행할 수 있습니다. 구문들을 작성하려면,
- 파이선 내부에서 사용된 그라스 구문을 지원하기 위해서 grass.script를 제공하는 lib/python/의 라이버러리를 조사하십시오.
참조 GRASS Python Scripting Library를 통하여 노트와 예제를 익히십시오.
- 그라스의 디렉토리 scripts/에 최종 사용자에게 제공되는 다수의 예제 시리즈가 있습니다.
바람직한 파이선 코드 체계를 보려면, 다음 사이트SUBMITTING_PYTHON를 보십시오.
외부에서 그라스 함수를 호출하는 파이선 구문의 작성
노트: 다음은 파이션 외부에서 그라스 함수를 사용하는 고급 사용예입니다. This is a more advanced use case of using GRASS' functionality from outside via Python. 보통은 그라스 환경하에서 그라스 파이션을 구동합니다. 즉, wxGUI에 내재된 파이션 셀이나 명령어 선상에서 수행하는 것입니다. (screenshot).
외부에서 그라스 함수를 사용하려면, 다음을 참조하세요. Working with GRASS without starting it explicitly.
MS-원도우
외부에서 파이선을 이용하여 그라스 함수를 사용하려면 몇몇의 환경변수를 설정하여야 합니다.
GISBASE= C:\GRASS-64 GISRC= C:\Documents and Settings\user\.grassrc6 LD_LIBRARY_PATH= C:\GRASS-64\lib PATH= C:\GRASS-64\etc;C:\GRASS-64\etc\python;C:\GRASS-64\lib;C:\GRASS-64\bin;C:\GRASS-64\extralib;C:\GRASS-64\msys\bin;C:\Python26; PYTHONLIB= C:\Python26 PYTHONPATH= C:\GRASS-64\etc\python GRASS_SH= C:\GRASS-64\msys\bin\sh.exe
몇몇 힌트:
- 위에서 언급한 ".grassrc6" 파일이 있어야 합니다. 최초 한번 그라스를 수행하시거나 아래 내용을 참조하십시오.
- 파이션 해설어(python.exe) 가 패스에 나와야 합니다.
- 파이션은 확장자 .py로 표기되어야 합니다.
- 당신이 확장자를 생략할 수 있어려며, PATHEXT가 .py를 포함하여야 합니다.
- PYTHONPATH 가 다음으로 연결되어야 합니다, %GISBASE%\etc\python
열거 사항 2-4는 파이션 적재가가 다룰 수 있습니다. 항목 5는 처음 시작 때 수행되어야 합니다. (현재로, MS=Windows는 조금 사정이 다른 것 같습니다.)
대체법으로 직접 그라스를 실시간적으로 수행하려면, 당신은 스스로 .grassrc6파일을 생성하여도 무방합니다. 예, ("grassdata"를 고려하여 현재의 디렉토리를 업데이트하여도 됩니다. :
GISDBASE: C:\Documents and Settings\user\grassdata LOCATION_NAME: nc_spm_08 MAPSET: user1 GRASS_DB_ENCODING: ascii
%GISRC%가 합당한 연결점을 향하고 있으면, 파일 명칭은 무관합니다.
윈도우에서 그라스 6.x의 위치는 아래와 같습니다.
%APPDATA%\GRASS6\grassrc6
윈도우 7에서는, 전형적인 %APPDATA% 용 셋팅은
C:\Users\<username>\AppData\Roaming
리눅스
외부 환경하에서 그라스 함수의 이용은 다음과 같이 환경변수를 지정하여야 합니다:
export GISBASE="/usr/local/grass-6.4.svn/" export PATH="$PATH:$GISBASE/bin:$GISBASE/scripts" export LD_LIBRARY_PATH="$LD_LIBRARY_PATH:$GISBASE/lib" # for parallel session management, we use process ID (PID) as lock file number: export GIS_LOCK=$$ # path to GRASS settings file export GISRC="$HOME/.grassrc6" export PYTHONPATH="$PYTHONPATH:$GISBASE/etc/python"
파이션 환경하에서 외부명령문 실행
파이션 환경하에서 외부명령어 실행에 대하여 배우려면, 다음을 참조하십시오:
http://docs.python.org/lib/module-subprocess.html
구 os.* 함수를 피하십시오. 섹션 17.1.3의 나열 항목은 Popen() 인텨페이스 사용과 유사하며, 윈도우즈 경우즍 더 강력합니다.
파이션 확장프로그램의 검정과 인스톨Testing and installing Python extensions
수정
스크립트가 수행가능한지 확인하십시오:
chmod +x /path/to/my.extension.py
During development개발도중, 파이션 스크립트를 파이션 수정자로 고칠 수 있습니다. a Python script can be debugged using the Python Debugger (pdb):
python -m pdb /path/to/my.extension.py input=my_input_layer output=my_output_layer option=value -f
Installation
Once you're happy with your script, you can put it in the scripts/ folder of your GRASS install. To do so, first create a directory named after your extension, then create a Makefile for it, and a HTML man page:
cd /path/to/grass_src/ cd scripts ls # It is useful to check out the existing scripts and their structure mkdir my.extension cd my.extension cp path/to/my.extension.py . touch my.extension.html touch Makefile
Next step is to edit the Makefile. It is a very simple text file, the only thing to check is to put the right extension name (WITHOUT the .py file extension) after PGM:
MODULE_TOPDIR = ../.. PGM = my.extension include $(MODULE_TOPDIR)/include/Make/Script.make default: script
The HTML file would be generated automatically. If you want to add more precisions in it, you can do it (just make sure you start at DESCRIPTION. See existing scripts.)
You can then run "make" within the my.extension folder. Running "make" in the extension directory places the resulting files in the staging directory (path/to/grass_src/dist.<YOUR_ARCH>/). If you're running GRASS from the staging directory (/path/to/grass_src/bin.<YOUR_ARCH>/grass7), subsequent commands will used the updated files.
# in your extension directory (/path/to/grass_src/scripts/my.extension/) make # Starting GRASS from the staging directory /path/to/grass_src/bin.<YOUR_ARCH>/grass7 my.extension help
You can also run "make install" from the top level directory of your GRASS install (say /usr/local/src/grass_trunk/). Running "make install" from the top level just copies the whole of the dist.<YOUR_ARCH>/ directory to the installation directory (e.g. /usr/local/grass70) and the bin.<YOUR_ARCH>/grass70 bin file to the bin directory (e.g. /usr/local/bin), and fixes any embedded paths in scripts and configuration files.
cd /path/to/grass_src make install # Starting GRASS as usual would work and show your extension available grass7 my.extension help
Python extensions in GRASS GIS
Python Scripting Library
pygrass Library
- See pygrass
Python Ctypes Interface
This interface allows calling GRASS library functions from Python scripts. See Python Ctypes Examples for details.
Examples:
- Latest and greatest: GRASS 7 Python scripts
More complicated examples<<-- TODO: update to Ctypes
Sample script for GRASS 6 raster access (use within GRASS, Spearfish session):
#!/usr/bin/env python
## TODO: update example to Ctypes
import os, sys
from grass.lib import grass
if "GISBASE" not in os.environ:
print "You must be in GRASS GIS to run this program."
sys.exit(1)
if len(sys.argv)==2:
input = sys.argv[1]
else:
input = raw_input("Raster Map Name? ")
# initialize
grass.G_gisinit('')
# find map in search path
mapset = grass.G_find_cell2(input, '')
# determine the inputmap type (CELL/FCELL/DCELL) */
data_type = grass.G_raster_map_type(input, mapset)
infd = grass.G_open_cell_old(input, mapset)
inrast = grass.G_allocate_raster_buf(data_type)
rown = 0
while True:
myrow = grass.G_get_raster_row(infd, inrast, rown, data_type)
print rown, myrow[0:10]
rown += 1
if rown == 476:
break
grass.G_close_cell(inrast)
grass.G_free(cell)
Sample script for vector access (use within GRASS, Spearfish session):
#!/usr/bin/python
# run within GRASS Spearfish session
# run this before starting python to append module search path:
# export PYTHONPATH=/usr/src/grass70/swig/python
# check with "import sys; sys.path"
# or:
# sys.path.append("/usr/src/grass70/swig/python")
# FIXME: install the grass bindings in $GISBASE/lib/ ?
import os, sys
from grass.lib import grass
from grass.lib import vector as grassvect
if "GISBASE" not in os.environ:
print "You must be in GRASS GIS to run this program."
sys.exit(1)
if len(sys.argv)==2:
input = sys.argv[1]
else:
input = raw_input("Vector Map Name? ")
# initialize
grass.G_gisinit('')
# find map in search path
mapset = grass.G_find_vector2(input,'')
# define map structure
map = grassvect.Map_info()
# define open level (level 2: topology)
grassvect.Vect_set_open_level (2)
# open existing map
grassvect.Vect_open_old(map, input, mapset)
# query
print 'Vect map: ', input
print 'Vect is 3D: ', grassvect.Vect_is_3d (map)
print 'Vect DB links: ', grassvect.Vect_get_num_dblinks(map)
print 'Map Scale: 1:', grassvect.Vect_get_scale(map)
print 'Number of areas:', grassvect.Vect_get_num_areas(map)
# close map
grassvect.Vect_close(map)
wxPython GUI development
- See the wxGUI wiki page
Python-GRASS add-ons
Stand-alone addons:
- Jáchym Čepický's PyWPS, GRASS-Web Processing Service (http://pywps.wald.intevation.org)
Using GRASS gui.tcl in Python
Here is some example code to use the grass automatically generated guis in python code. This could (should) all be bundled up and abstracted away so that the implementation can be replaced later.
import Tkinter
import os
# Startup (once):
tk = Tkinter.Tk()
tk.eval ("wm withdraw .")
tk.eval ("source $env(GISBASE)/etc/gui.tcl")
# Here you could do various things to change what the gui does
# See gui.tcl and README.GUI
# Make a gui (per dialog)
# This sets up a window for the command.
# This can be different to integrate with tkinter:
tk.eval ('set path ".dialog$dlg"')
tk.eval ('toplevel .dialog$dlg')
# Load the code for this command:
fd = os.popen ("d.vect --tcltk")
gui = fd.read()
# Run it
tk.eval(gui)
dlg = tk.eval('set dlg') # This is used later to get and set
# Get the current command in the gui we just made:
currentcommand = tk.eval ("dialog_get_command " + dlg)
# Set the command in the dialog we just made:
tk.eval ("dialog_set_command " + dlg + " {d.vect map=roads}")
FAQ
- Q: Error message오류 사항??? "execl() failed: Permission denied" - 무엇으로 해결하나?
- A: Be sure that the execute bit of the script is set. 당신 스크립트의 실행비트가 결정되었는지 확인하세요???
연결
일반 안내
- Wikibook Python Programming
- Quick Python tutorial 다른 언어를 사용하는 개발자 용
- More Python tutorials 개발자 용for programmers
- Python programming style guide
- Python Editors
프로그래밍
- Python and GRASS:
- Library interfaces: [GRASS Python Scripting Library http://grass.osgeo.org/programming7/pythonlib.html]
- Graphical user interface (GIU): [GRASS wxPython-based GUI http://grass.osgeo.org/programming7/wxpythonlib.html]
- PyWPS, GRASS-Web Processing Service: WPS
- Python and OSGeo:
- Python and GDAL/OGR:
- Python bindings to PROJ:
- Python and GIS:
- Python and Statistics:
- RPy - Python interface to the R-statistics programming language
- Bindings:
- SIP (C/C++ bindings generator) http://directory.fsf.org/all/Python-SIP.html
- Cython - C-Extensions for Python (compile where speed is needed)
- Other external projects
발표문헌
From FOSS4G2006:
- A Python sweeps in the GRASS - A. Frigeri 2006
- GRASS goes web: PyWPS - J. Cepicky 2006 (see also WPS)