3

I've been trying to get standalone QGIS python scripting to work, but for some reason after I import processing, I cannot print anything to the console, nor can I write anything to file. My end goal is to create a library of standalone processing scripts, so being able to output information to the console is important to me.

I slightly altered the code from Error: algorithm not found, since the solution given gave me the error of "no module named processing".

My code is as follows:

#!/usr/bin/python
print "1"
import qgis
print "2"
from qgis.core import *
print "3"
from qgis.utils import *
utils.uninstallErrorHook() 
print "4"
app = qgis.core.QgsApplication([], True)
print "5"
import processing
print "6"

class DummyInterface(object):
    def __init__(self):
        self.destCrs = None
    def __getattr__(self, *args, **kwargs):
        def dummy(*args, **kwargs):
            return DummyInterface()
        return dummy
    def __iter__(self):
        return self
    def next(self):
        raise StopIteration
    def layers(self):
        # simulate iface.legendInterface().layers()
        return qgis.core.QgsMapLayerRegistry.instance().mapLayers().values()
iface = DummyInterface()
plugin = processing.classFactory(iface)

f = open("/home/alex/output.txt", "a")

a_list = processing.alglist()
for item in a_list:
    f.write(str(item))

f.write(len(a_list))

f.close()

When run from the terminal, this is what I get:

alex@blackbook-bear: ~
$ python test.py
1
2
3
4
5
alex@blackbook-bear: ~
$ cat /home/alex/output.txt
cat: /home/alex/output.txt: No such file or directory
alex@blackbook-bear: ~
$ 
Alex McVittie
  • 799
  • 5
  • 19
  • How are you running this script? It's acting like import processing is raising an exception, but something is hiding the stderr output. – larsks Dec 02 '15 at 02:46
  • @larsks I'm executing it from a terminal. I'm running Linux on my machine. – Alex McVittie Dec 02 '15 at 02:49
  • Sorry, that was a stupid question caused by reading too quickly :). – larsks Dec 02 '15 at 02:58
  • @larsks I was able to solve it. I've posted my solution as a follow up. You were correct, there was something hiding stderr - I just wasn't disabling the thing that hides it properly. – Alex McVittie Dec 02 '15 at 05:20

1 Answers1

1

Managed to solve the issue.

First off, I had the uninstallErrorHook() being used wrong. Instead of

utils.uninstallErrorHook() 

I should have used

uninstallErrorHook() 

Next, I had the wrong version of the processing libs downloaded. The version I had was incompatible with QGIS 2.8, but the errors it was throwing were invisible to me. This was solved by pointing to the correct location, which was /usr/share/qgis/python/plugins. Found that by using the builtin Python console in QGIS and entering

import sys
sys.path

and poking around directories a bit.

Third, it seems like Python likes calling the processing libraries like this better:

from processing.core.Processing import Processing
Processing.initialize()

In the end, my successful working script that was modified off of another answer looks like this:

#!/usr/bin/python
# Prepare the environment
import sys
# Prepare processing framework 
sys.path.append('/usr/share/qgis/python/plugins')
from qgis.utils import *
uninstallErrorHook() 
from qgis.core import QgsApplication
from PyQt4.QtGui import QApplication
app = QApplication([], True)

QgsApplication.setPrefixPath("/usr", True)
QgsApplication.initQgis()
from processing.core.Processing import Processing
Processing.initialize()


print Processing.algs

# Exit applications
QgsApplication.exitQgis()
QApplication.exit()

Still can't get processing.alglist() to work but the Processing class seems equally promising and seems like it does the same thing.

Alex McVittie
  • 799
  • 5
  • 19