¿Cómo ejecutar scripts de Python usando gimpfu desde la línea de comandos de Windows?

Estoy tratando de usar las funciones de gimp 2.8.22 para convertir un pdf a jpeg y quiero hacerlo con un script de python usando la biblioteca gimpfu de mi cmd de windows (he instalado python 3.6.1).

En este momento, estoy tratando de hacer eso con un script de ejemplo:

#!/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: pdb.gimp_context_push() # Set the text color gimp.set_foreground(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) background.fill(BACKGROUND_FILL) img.add_layer(background, 1) # Create a new image window gimp.Display(img) # Show the new image window gimp.displays_flush() # Restore the old foreground color: pdb.gimp_context_pop() register( "python_fu_hello_world", "Hello world image", "Create a new image with your text string", "Akkana Peck", "Akkana Peck", "2010", "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="/File/Create") main() 

Intento ejecutar el script desde mi cmd de esta manera:

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

Sin embargo, no importa lo que haga, siempre aparece el mismo mensaje de error:

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

Edición: Ok, gracias. Dejé de lado la statement de la interfaz y también probé el ejemplo más simple para averiguar cuál es el problema:

 #!/usr/bin/env python # Hello World in GIMP Python from gimpfu import * def hello_world(): gimp.message("Hello, GIMP world!\n") register( "hello_world", '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", "2017", "Hello World", "", [], [], hello_world, menu="/Filters/HelloWorld", ) main() 

El script realmente funciona cuando lo ejecuto desde Gimp, pero cuando bash ejecutarlo desde mi cmd, Gimp se abre con otro cmd que dice: Error: ( : 1) eval: unbound variable: hello_world

¿Alguien sabe lo que me estoy perdiendo aquí?

Para ejecutar un script de Python no es necesario que se registre como un complemento. En mi opinión, incluso debe evitar esto, esto innecesariamente contamina los menús de Gimp y el espacio de nombres de procedimientos. Aquí hay un ejemplo:

El script por lotes (guardado como batch.py ):

 #!/usr/bin/python # -*- coding: iso-8859-15 -*- import os,glob,sys,time from gimpfu import * def process(infile): print "Processing file %s " % infile image = pdb.file_jpeg_load(infile,infile) drawable = pdb.gimp_image_get_active_layer(image) 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) outfile=os.path.join('processed',os.path.basename(infile)) outfile=os.path.join(os.path.dirname(infile),outfile) 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 pdb.gimp_image_delete(image) def run(directory): start=time.time() print "Running on directory \"%s\"" % directory # os.mkdir(os.path.join(directory,'processed')) for infile in glob.glob(os.path.join(directory, '*.jpg')): process(infile) end=time.time() print "Finished, total processing time: %.2f seconds" % (end-start) if __name__ == "__main__": print "Running as __main__ with args: %s" % sys.argv 

Para llamarlo:

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

Los parámetros en cámara lenta:

  • -idf : funciona sin interfaz de usuario, y no carga datos ni fonts (quizás -idf guardar las fonts para cargar archivos PDF)
  • --batch-interpreter python-fu-eval : todo lo que sigue -b es Python, no script-fu
  • "import sys;sys.path=['.']+sys.path;import batch;batch.run('./images')" : el código que le pedimos a Gimp que ejecute, a saber:
    • import sys;sys.path=['.']+sys.path; : extender la ruta de importación para incluir el directorio actual
    • import batch; : importe el archivo con nuestro script, que ahora se encuentra en un directorio que forma parte de la ruta.
    • batch.run('./images') : llama a la función run() del módulo de batch que importamos, dándole el nombre de un directorio que contiene las imágenes para procesar.
  • -b "pdb.gimp_quit(1)" : otra pieza de python: salir cuando haya terminado.

Observe cómo la línea de comandos usa hábilmente comillas dobles y simples para pasar todos los parámetros a Gimp y luego a Python (*). Y sí, puede usar barras diagonales como separadores de archivos en Windows.

Para depurar, las cosas se complican un poco en Windows porque no siempre hay una secuencia stdout. Cosas que pueden ayudar:

  • elimine el parámetro -i temporalmente para que obtenga la interfaz de usuario y tal vez la oportunidad de ver los mensajes.
  • Agregue --verbose que hace que Gimp inicie una ventana de consola secundaria.
  • Hay otros trucos para ver los mensajes listados aquí .
  • También puede iniciar Gimp normalmente y ejecutar su script desde la consola de Python-fu (Filtros> Python-fu> Consola). Tendrá que extender la ruta e importar el archivo “manualmente”.

(*) En un shell Linux / OSX, uno haría lo contrario: comillas simples para el shell, comillas dobles para Python.

Porque la secuencia de comandos que está utilizando crea la imagen y luego la muestra en una ventana … Pero está llamando a Gimp con el indicador --no-interface , por lo que no se muestra la ventana.

En mi humilde opinión para convertir de PDF a JPEG, el comando de convert de ImageMagick sería mucho más simple.

Además, en Windows, Gimp viene con su propio intérprete incorporado de Python 2.7, por lo que debe escribir su código de Python para esa versión, y no es necesario instalar otro.