How to run python scripts using gimpfu from command line?

I'm trying to use functions of gimp 2.8.22 to convert a pdf to jpeg and i want to do that with a python script using the gimpfu library from my windows cmd (i have installed python 3.6.1).

Right now, i't trying to do that with an example script:

#!/usr/bin/env python

# Hello World in GIMP Python

from gimpfu import *

def hello_world(initstr, font, size, color) :
    # First do a quick sanity check on the font
    if font == 'Comic Sans MS' :
        initstr = "Comic Sans? Are you sure?"

    # Make a new image. Size 10x10 for now -- we'll resize later.
    img = gimp.Image(1, 1, RGB)

    # Save the current foreground color:

    # Set the text color

    # Create a new text layer (-1 for the layer means create a new layer)
    layer = pdb.gimp_text_fontname(img, None, 0, 0, initstr, 10,
                                   True, size, PIXELS, font)

    # Resize the image to the size of the layer
    img.resize(layer.width, layer.height, 0, 0)

    # Background layer.
    # Can't add this first because we don't know the size of the text layer.
    background = gimp.Layer(img, "Background", layer.width, layer.height,
                            RGB_IMAGE, 100, NORMAL_MODE)
    img.add_layer(background, 1)

    # Create a new image window
    # Show the new image window

    # Restore the old foreground color:

    "Hello world image",
    "Create a new image with your text string",
    "Akkana Peck",
    "Akkana Peck",
    "Hello world (Py)...",
    "",      # Create a new image, don't work on an existing one
        (PF_STRING, "string", "Text string", 'Hello, world!'),
        (PF_FONT, "font", "Font face", "Sans"),
        (PF_SPINNER, "size", "Font size", 50, (1, 3000, 1)),
        (PF_COLOR, "color", "Text color", (1.0, 0.0, 0.0))
    hello_world, menu="<Image>/File/Create")


I try to run the script from my cmd like this:

gimp-2.8 --no-interface --batch '(python_fu_hello_world RUN-NONINTERACTIVE "Hello" Arial 50 red)' -b '(gimp-quit 1)'

However, no matter what i do, i always geht the same error message:

(gimp-2.8:1020): LibGimpBase-WARNING **: gimp-2.8: gimp_wire_read(): error

edit: Ok, thanks. I left out the interface statement and I also tried out the most simple example to figure out whats wrong:

#!/usr/bin/env python

# Hello World in GIMP Python

from gimpfu import *

def hello_world():
 gimp.message("Hello, GIMP world!\n")

 'A simple Python-Fu "Hello, World" plug-in',
 'When run this plug-in prints "Hello, GIMP world!" in a dialog box.',
 "Tony Podlaski",
 "Tony Podlaski 2017. MIT License",
 "Hello World",


The script actually works when i run it from Gimp itself, but when i try to run it from my cmd, Gimp opens with another cmd saying: Error: ( : 1) eval: unbound variable: hello_world

Does someone know what i'm missing here?


  • To run a python script you don't need to have it register as a plugin. IMHO you should even avoid this, this unnecessarily pollutes Gimp's menus and procedure name space. Here is an example:

    The batch script (saved as

    # -*- coding: iso-8859-15 -*-
    import os, glob, sys, time
    from gimpfu import *
    def process(infile):
            print "Processing file %s " % infile
            image = pdb.gimp_file_load(infile, infile, run_mode=RUN_NONINTERACTIVE)
            drawable = image.active_layer
            print "File %s loaded OK" % infile
            pdb.plug_in_photocopy(image, drawable,8.,0.8,0.2,0.2)
            pdb.plug_in_cartoon(image, drawable, 7.,0.2)
            print "Saving to %s" % outfile
            pdb.file_jpeg_save(image, drawable, outfile, outfile, "0.5",0,1,0,"",0,1,0,0)
            print "Saved to %s" % outfile
    def run(directory):
            print "Running on directory \"%s\"" % directory
    #   os.mkdir(os.path.join(directory,'processed'))
            for infile in glob.glob(os.path.join(directory, '*.jpg')):
            print "Finished, total processing time: %.2f seconds" % (end-start)
    if __name__ == "__main__":
            print "Running as __main__ with args: %s" % sys.argv

    To call it:

    gimp -idf --batch-interpreter python-fu-eval -b "import sys;sys.path=['.']+sys.path;import batch;'./images')" -b "pdb.gimp_quit(1)"

    The parameters in slow-motion:

    • -idf: work without user interface, and load neither data nor fonts (you may perhaps need to keep the fonts to load pdfs)
    • --batch-interpreter python-fu-eval: whatever follows -b is Python, not script-fu
    • "import sys;sys.path=['.']+sys.path;import batch;'./images')": the code that we ask Gimp to execute, namely:
      • import sys;sys.path=['.']+sys.path;: extend the import path to include the current directory
      • import batch;: import the file with our script, which is now in a directory which is part of the path.
      •'./images'): call the run() function of the batch module we imported, giving it the name of a directory containing the images to process.
    • -b "pdb.gimp_quit(1)": another piece of python: exit when done.

    Note how the command line cleverly uses double and single quotes to pass all parameters to Gimp and then to Python(*). And yes, you can use forward slashes as file separators in Windows.

    To debug, matters are bit complicated in Windows because there is no always a stdout stream. Things that can help:

    • remove the -i parameter temporarily so that you get the UI and perhaps a chance to see messages.
    • Add --verbose which makes Gimp start a secondary console window.
    • There are other tricks to see messages listed here.
    • You can also start Gimp normally and run your script from the Python-fu console (Filters>Python-fu>Console). You will have to extend the path and import the file "manually".

    (*) In a Linux/OSX shell one would do the opposite: single quotes for the shell, double quotes for Python.