If you write directly to the dataprovider, there is no edit session management done by QGIS. Instead you should use the editing API by QgsVectorLayer, which will give you the expected results.
QGIS 2.0 (and 1.9 / master)
fid = 1 # feature id
attrs = { 0: 2,1: "B",2:"Dont!!!"} # attributes
vLayer.changeAttributeValues({ fid : attrs })
or a very intuitive method, if you already have a copy of the feature you are going to update
fid = 1 # feature id
feat = vLayer.getFeatures( QgsFeatureRequest().setFilterFid( fid ) ).next()
feat['number'] = 2
feat['char'] = 'B'
feat['advice'] = 'Dont!!!'
vLayer.updateFeature( feat )
QGIS 1.8
fid = 1 # feature id
attrs = { 0: QVariant(2),1: QVariant("B"),2:QVariant("Dont!!!")} # attributes
for attr, val in attrs.iteritems():
vLayer.changeAttributeValue( fid, attr, val )
There is no need to start an edit session if you use the vLayer.dataProvider().insertEditCommandHere()
methods, as the edit command will be executed immediately.
(This is a very common misconception and I guess it should be added to the QGIS documentation and pyqgis cookbook more prominently)
Finally found the proper way of running processing algorithms in PyQGIS standalone scripts.
This answer is based on answers to Problem with import qgis.core when writing a stand-alone PyQGIS script and to Error: Algorithm not found, which is in turn based on a Qgis-dev mailing-list discussion.
I suggest you to follow the work flow given in Problem with import qgis.core when writing a stand-alone PyQGIS script to enable your QGIS libraries in your OSGeo4W Shell. Once you have your QGIS libraries working properly, we can proceed to the 2nd part of your question: running processing algorithms in a standalone PyQGIS script.
I've modified your original script a bit and tested it on Windows 7 and GNU/Linux. I use processing version 2.2.0-2 and suggest you to use this version, which is the current one at the moment of writing the answer.
import os, sys, glob
# Prepare the environment
from qgis.core import * # qgis.core must be imported before PyQt4.QtGui!!!
from PyQt4.QtGui import *
app = QApplication([])
QgsApplication.setPrefixPath("C:\\Program Files\\QGIS Brighton\\apps\\qgis", True) # The True value is important
QgsApplication.initQgis()
from os.path import expanduser
home = expanduser("~")
# Folder path of the Results for shapefiles
path_dir = home + "\Desktop\Test\\"
path_res = path_dir + "Results\\"
# Prepare processing framework
sys.path.append( home + '\.qgis2\python\plugins' )
from processing.core.Processing import Processing
Processing.initialize()
from processing.tools import *
def run():
outputs_1=general.runalg("qgis:creategrid", 1000, 1000, 24108, 18351.157175, 258293.802316, 665638.226408, 1, 'EPSG:7405', None)
# Set directory, search for all polygon .shp files and run the Create Grid and Clip algorithms then output results into Results folder
os.chdir(path_dir + "Shapefiles\\")
for fname in glob.glob("*.shp"):
outputs_2=general.runalg("qgis:clip", outputs_1['SAVENAME'], fname, path_res + "/"+ fname)
run()
QgsApplication.exitQgis()
# Remove the above line when running in QGIS
Note that I have taken the grid creation out of the for loop, as you don't really need a new grid to perform each clip.
This should do the trick!
Best Answer
I tested your code and stripped the problem down to the paths you are using. The error seems to be the forward slashes (/) that confuse your windows python installation. You should use backslashes on windows and use them as escaped symbol (eg. double backslash \). I updated your code with the paths of my system (an OSGeo4W64 installation), you can change them to match your directory structure:
Now the script should work. Sidenote: I ran the script from OSGeo4W Shell using the
python-qgis
command (python interpreter with QGIS paths). In case PyCharm still throws some errors, try running your script there or in PyDev (Eclipse). For reference: There is a similar answer to this one that also shows how to call native c++ algorithms from python.