How to run python scripts using gimpfu from windows command line?

匿名 (未验证) 提交于 2019-12-03 02:03:01

问题:

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:     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() 

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")  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() 

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?

回答1:

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 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 

To call it:

gimp -idf --batch-interpreter python-fu-eval -b "import sys;sys.path=['.']+sys.path;import batch;batch.run('./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;batch.run('./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.
    • batch.run('./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.



回答2:

Because the script you are using creates the image and then shows it in a window.... But you are calling Gimp with the --no-interface flag so the window is not shown.

IMHO to convert from PDF to JPEG, ImageMagick's convert command would be a lot simpler.

Also, in Windows Gimp comes with its own built-in Python 2.7 interpreter, so you have to write your Python code for that version, and there is no need to install another one.



标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!