Tools for Python programming: Difference between revisions

From GRASS-Wiki
Jump to navigation Jump to search
(longer headings)
(→‎PyCharm IDE: add GRASS GIS 8 support)
 
(25 intermediate revisions by 4 users not shown)
Line 8: Line 8:
pep8 lmgr/toolbars.py
pep8 lmgr/toolbars.py
</source>
</source>
'''Please see https://trac.osgeo.org/grass/wiki/Submitting/Python for GRASS GIS specific details.'''


== Pylint static checker ==
== Pylint static checker ==
Line 54: Line 56:
pyreverse -o pdf -p wxgui --only-classnames core/ gui_core/ lmgr/ mapdisp/
pyreverse -o pdf -p wxgui --only-classnames core/ gui_core/ lmgr/ mapdisp/
</source>
</source>
== PyCharm IDE ==
[https://www.jetbrains.com/pycharm/ PyCharm] is a editor, or better to say IDE, for Python with large number of tools integrated into it.
* GRASS GIS 7: e.g., GRASS 7.8.8 comes on MS Windows with a new BAT initialization 'python-grass78.bat' file which can be used for setting up the PyCharm environment.
* GRASS GIS 8: e.g., GRASS 8.3.0 comes on MS Windows with a new BAT initialization 'python-grass83.bat' file which can be used for setting up the PyCharm environment.
Create a new PyCharm project (''File -> New Project'').
{{fig|pycharm-create-new-project-0|Go to 'Existing interpreter' section and click on '...'}}
{{fig|pycharm-create-new-project-1|Click on '...' in 'System Interpreter' section and choose 'C:\OSGeo4W64\bin\python-grass78.bat' file}}
{{fig|pycharm-create-new-project-2|Click on 'Create' in order to create a new PyCharm project}}
Add a new Python file into the created project by ''File -> New''. See a sample Python script below. This script creates a new temporary GRASS location and prints the settings. Then, the temporary location is deleted.
<source lang="python">
import os
import tempfile
import shutil
import grass.script as gs
import grass.script.setup as gsetup
# create temporary location
dbase=tempfile.gettempdir()
location='demo'
gsetup.init(os.environ['GISBASE'], dbase, location, 'PERMANENT')
gs.create_location(dbase, location)
print(gs.gisenv())
# remove location
shutil.rmtree(os.path.join(dbase, location))
</source>
{{fig|pycharm-launch-dialog|Go to ''Run -> Run'' and choose a script to run}}
{{fig|pycharm-launch-script|Example of GRASS script run from PyCharm environment|size=800px}}


== Spyder editor ==
== Spyder editor ==


Spyder is a editor, or better to say IDE, for Python with large number of tools integrated in it. To get better results, you should run Spyder within a GRASS session. It has an integrated pylint tool. Bugs and requests can be reported here: https://code.google.com/p/spyderlib/ ([https://bitbucket.org/spyder-ide/spyderlib/downloads download Spyder], note that many Linux installations provide "spyder" as a package for installation).
[https://www.spyder-ide.org/ Spyder] is a editor, or better to say IDE, for Python with large number of tools integrated into it. To get better results, you should run Spyder within a GRASS GIS session. It has an integrated pylint tool to verify the source code instantly for undefined or unused variables, wrong indentation and more.  


Windows: you may also install Spyder as part of [http://winpython.sourceforge.net/ WinPython]
* Linux: many distributions provide "spyder" as a package for easy installation.
* Windows: you may also install Spyder as part of [http://winpython.sourceforge.net/ WinPython]
* ...


Linux:
'''Important''': Change the editor settings from 'tab' to ''''4 spaces'''' (according to the style guide at https://trac.osgeo.org/grass/wiki/Submitting/Python):
  yum install spyder
* Menu Tools > Preferences > Editor > Advanced Settings: Indentation characters:  4 spaces


Ideal way how to run Spyder within a GRASS session ('<tt>.</tt>' can by replaced by any directory):
An ideal way how to run Spyder within a GRASS session ('<tt>.</tt>' can by replaced by any directory):
  spyder -w . 2>/dev/null &
  spyder -w . 2>/dev/null &
== Eric Python IDE ==
"Eric is a full featured Python and Ruby editor and IDE, written in python":
* http://eric-ide.python-projects.org/eric-screenshots.html
== Simple Python Editor in GRASS GIS ==
[[File:Simple python editor v buffer.png|300px|thumb|right|Simple Python editor with the interactive Python shell (console) in the background]]
Since GRASS GIS 7.2, there is an embedded editor for Python in GRASS GIS with basic set of editing features. It is aimed towards beginners and contains examples and templates. User scripts and newly developed GRASS GIS modules can be executed in the (command) Console tab directly from the editor.


{{Python}}
{{Python}}

Latest revision as of 08:22, 17 October 2023

To help with finding broken code, unused variables and other problems, there are several tools available. Described tools are free and open source and usually widely available in GNU/Linux distribution repositories or through pip. They can be connected to some code editor or run separately from command line. Some editors integrate some of these tools. Generally, all tools need to be run from a GRASS session.

pep8 for checking of style

Checks the basic correctness and style of Python code according to PEP 8 -- Style Guide for Python Code.

pep8 lmgr/toolbars.py

Please see https://trac.osgeo.org/grass/wiki/Submitting/Python for GRASS GIS specific details.

Pylint static checker

Main article: Pylint rc file for GRASS

Pylint is a tool for static source code analysis. It provides wide range of analysis and is highly customizable. It is integrated to some Python editors.

cProfile profiling tool

cProfile is a Python profiling tool. It can be used directly in your Python source code or from the command line. The output can be processed by the gprof2dot tool which generates call graph in dot (depends on Graphviz is necessary to render the graph).

For Ubuntu, Graphviz and cProfile are available in repository (graphviz and python-profiler packages). gprof2dot tool needs to be installed through pip (sudo pip install gprof2dot).

# does the actual profiling
python -m cProfile -o output.pstats  my_python_script.py --various-my-script-parameters foo bar

# creates a callgraph with profiling info (filtered)
gprof2dot -f pstats output.pstats | dot -Tpng -o gprof2dot_output.png
#!/bin/bash

# Usage:
# ./python-profile.sh your_python_script.py and its parameters
# need to run in the directory which contains profiled script 

OUTFILE=$(basename $1 .py)_profile

python -m cProfile -o $OUTFILE.pstats $* \
&& gprof2dot -f pstats $OUTFILE.pstats > $OUTFILE.dot \
&& dot -Tpng -o $OUTFILE.png $OUTFILE.dot \
&& dot -Tpdf -o $OUTFILE.pdf $OUTFILE.dot

Pyreverse static checker

Needs to run in distribution directory.

Note that it shows only import and usage dependencies. Because of the Python dynamic typing it is not possible to find dependency on particular object interface when the object is not created but only passed to a function or object constructor.

cd dist.../etc/gui/wxpython
pyreverse -o pdf -p wxgui --only-classnames core/ gui_core/ lmgr/ mapdisp/

PyCharm IDE

PyCharm is a editor, or better to say IDE, for Python with large number of tools integrated into it.

  • GRASS GIS 7: e.g., GRASS 7.8.8 comes on MS Windows with a new BAT initialization 'python-grass78.bat' file which can be used for setting up the PyCharm environment.
  • GRASS GIS 8: e.g., GRASS 8.3.0 comes on MS Windows with a new BAT initialization 'python-grass83.bat' file which can be used for setting up the PyCharm environment.

Create a new PyCharm project (File -> New Project).

Go to 'Existing interpreter' section and click on '...'
Click on '...' in 'System Interpreter' section and choose 'C:\OSGeo4W64\bin\python-grass78.bat' file
Click on 'Create' in order to create a new PyCharm project

Add a new Python file into the created project by File -> New. See a sample Python script below. This script creates a new temporary GRASS location and prints the settings. Then, the temporary location is deleted.

import os
import tempfile
import shutil
import grass.script as gs
import grass.script.setup as gsetup

# create temporary location
dbase=tempfile.gettempdir()
location='demo'
gsetup.init(os.environ['GISBASE'], dbase, location, 'PERMANENT')
gs.create_location(dbase, location)
print(gs.gisenv())

# remove location
shutil.rmtree(os.path.join(dbase, location))
Go to Run -> Run and choose a script to run
Example of GRASS script run from PyCharm environment

Spyder editor

Spyder is a editor, or better to say IDE, for Python with large number of tools integrated into it. To get better results, you should run Spyder within a GRASS GIS session. It has an integrated pylint tool to verify the source code instantly for undefined or unused variables, wrong indentation and more.

  • Linux: many distributions provide "spyder" as a package for easy installation.
  • Windows: you may also install Spyder as part of WinPython
  • ...

Important: Change the editor settings from 'tab' to '4 spaces' (according to the style guide at https://trac.osgeo.org/grass/wiki/Submitting/Python):

  • Menu Tools > Preferences > Editor > Advanced Settings: Indentation characters: 4 spaces

An ideal way how to run Spyder within a GRASS session ('.' can by replaced by any directory):

spyder -w . 2>/dev/null &

Eric Python IDE

"Eric is a full featured Python and Ruby editor and IDE, written in python":

Simple Python Editor in GRASS GIS

Simple Python editor with the interactive Python shell (console) in the background

Since GRASS GIS 7.2, there is an embedded editor for Python in GRASS GIS with basic set of editing features. It is aimed towards beginners and contains examples and templates. User scripts and newly developed GRASS GIS modules can be executed in the (command) Console tab directly from the editor.