Some ideas and tools to develop Python 3.8 plugins for GIMP 2.99.4

Overview

gimp-python-development

Some ideas and tools to develop Python 3.8 plugins for GIMP 2.99.4. GIMP 2.99.4 is the latest unstable pre-release of GIMP 3. It suppots Python 3, however it's documentation is rather poor, and also one thing that always annoyed me was it uses the system Python distribution and adds on top of it some libraries. Also, a GIMP plugin must run inside GIMP... So, let's hack to have a proper developing environment!

Install GIMP 2.99.4

GIMP 2.99.4 comes with pre-compiled binaries in a flatpak distribution. So, first of all if you don't have flatpak, assuming you are on a Debian-based Linux distro:

$ sudo apt install flatpak

Flatpak is a distribution system, like Apt, but focused on end-user applications and isolation. Like Docker, it isolates the compiled application in its own Sandbox, however it is not actually virtualized. Let's install GIMP 2.99.4:

flatpak remote-add --if-not-exists flathub https://dl.flathub.org/repo/flathub.flatpakrepo
flatpak remote-add --if-not-exists flathub https://dl.flathub.org/beta-repo/flathub.flatpakrepo
flatpak install --user https://flathub.org/beta-repo/appstream/org.gimp.GIMP.flatpakref

Say yes to permissions, etc. Then you will be able to run GIMP from flatpak:

flatpak run org.gimp.GIMP//beta

Understanding which Python is using GIMP

So, in order to start developing we must understand which Python executable is using GIMP. This was tricky to me at first, but it actually has a very nice outcome. As I mentioned, GIMP uses the system Python executable, if we go to the menu entry Filters > Development > Python-Fu > Python Console a window will be prompt with a Python console that will say:

GIMP 2.99.4 Python Console
Python 3.8.6 (default, Nov 10 2011, 15:00:00) 
[GCC 10.2.0]
>>> 

My main issue here to locate this Python was that I didn't have this Python installed in my system, because I'm using Python 3.9. Although, I don't have any experience with Flatpak, Docker experience suggested that was using the Python provided by its isolation environment. So, searching the Flatpak documentation I found this approach:

flatpak run --command=python org.gimp.GIMP//beta

And magic happened:

Python 3.8.6 (default, Nov 10 2011, 15:00:00) 
[GCC 10.2.0] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>>

Then, if we use this trick using --comand=bash instead of Python executable we will be having the shell of the Sandbox. So, when you thought it this is very good news. Because, we finally have an isolated Python environment for GIMP, a tricky one, but we have it!!

Prepare the environment

As it is thought as a minimal environment, it lacks some basic tools for developing Python code, let's install some of them. First, things firsts, let's ensure pip is installed:

$ python -m ensurepip

Once installed, update pip using pip to check pip works!

$ python -m pip install -U pip

One pip is updated let's grab at least IPython:

$ python -m pip install ipython

Now, from inside the plug-in Python Console, we can verify that we can import IPython:

>>> import IPython
>>> IPython.embed()
Python 3.8.6 (default, Nov 10 2011, 15:00:00) 
Type 'copyright', 'credits' or 'license' for more information
IPython 7.20.0 -- An enhanced Interactive Python. Type '?' for help.

In [1]: 

However, it will crash inmediadtely. This is because the plug-in messes up with sys.stdout and sys.sterr objects, needed to be able to reproduce a 'console' application. So, there is possibility to improve the Python Console plug-in to become an IPython Console plug-in working on the Python code of this plug-in and adapt the way it manages those two objects.

Getting a minimal setup to develop code

Having an IPython terminal is an advantatge over Python, because we have some extra instructions and access to shell, using !. However, what we really want is to be able to run code externally from GIMP, to be able to rapidly prototype code, specially in Python. A possible solution could be use a PyDev server - client scheme. PyDev was originally developed to be used inside Eclipse, but also PyCharm has a port of its own. Where PyCharm or the IDE will act as a server for debugging and the app will act a client of that debugger.

So, let's do that. In PyCharm go to Edit Configurations ... > + > Python Debug Server, there you will see the instructions to run this scheme in a Python project. Mines are:

  • Install pydevd-pycharm corresponding to a current PyCharm version:
pip install pydevd-pycharm~=203.7148.72
  • Run this two lines inside your application (a.k.a GIMP):
import pydevd_pycharm
pydevd_pycharm.settrace('localhost', port=9000, stdoutToServer=True, stderrToServer=True)

If you try this two lines inside the plug-in Python Console you will end with the same problem than IPython, these two solutions rely on sys.stdout and sys.stderr, but we are not giving up. So the main idea is to execute those two lines. So easy, let's hack into the plug-in files and put them. However, for the sake of the demo, let's use an even simpler plug-in, there is a bright new plug-ins templates for several languages in a new location Filters > Development > Goat Exercices > Excercise a goat and a python. Which file is located (from the sandbox point of view) at /app/lib/gimp/2.99/extensions/org.gimp.extension.goat-exercises/goat-exercise-py3.py and from the host point of view (and the editable one) at ~/.local/share/flatpak/app/org.gimp.GIMP/lib/gimp/2.99/extensions/org.gimp.extension.goat-exercises/goat-exercise-py3.py

This plug-in is a simple plug-in where the current loaded GIMP image (thus you need one opened), is color inverted. We are going to hook to our server using this plug-in.

We can define a function to wrap the trace:

def set_trace(): return pydevd_pycharm.settrace('localhost', port=9000, stdoutToServer=True, stderrToServer=True)

So the question to ask now is where the hell I put this call. Obviously you want it to run when the plug-in starts, there is a line where the main method is defined:

def run(self, procedure, run_mode, image, drawable, args, run_data):

One can add the set_trace() call just there, however we will not know if it is actually running, and what is worse, we will freeze GIMP! So, we need one last leap of faith and multiprocessing, more multiprocessing than faith. So, we have to add this import:

import multiprocessing as mp

And just before the while (True) loop begins, we can add:

th = mp.Process(target=set_trace)
th.start()

Before any return, this should be called th.terminate() to avoid another freeze. And it works! We are providing an isolated Python terminal to the debugger, which is running inside GIMP process, so it has access to GIMP bindings. My case:

GIMP PyDev Demo

Modify the file

There is a modified version of the plug-in in the repo, you can use it to copy it to the app folder. However, notice that you need to use you actual environment and not the Sandbox, so, assuming that you are in the repo's root folder:

$ cp plug-ins/pydev/goat-exercise-py3.py ~/.local/share/flatpak/app/org.gimp.GIMP/current/active/files/lib/gimp/2.99/extensions/org.gimp.extension.goat-exercises

Update: first version of PyDev plugin

To enable it, just declare in GIMP plugin paths your path to plug-ins folder of this repo. The way to do so is in Edit > Preferences > Folders > Scripts. The reboot GIMP and look if there is a new item under Filers > Development > Python > PyDev Client. Also notice you will need to install the plugin dependencies in the Python environment GIMP is using, in my case the Sandbox one, check previous sections of this readme. Before, launching the plug-in you should have started the PyDev server inside PyCharm.

Then you can run Python code directly from PyCharm, happy hacking.

GIMP PyDev Demo

TODO list

  • Create a minimal Python plug-in to create a PyDev client. → First version available.
  • Fork Python Console plug-in to be able to run IPython. Only forked, for the moment states the same functionality.
  • Create a minimal Python package which depends on IPython and pydev, and other dev stuff, to install it to be able to use the new plugins.
  • Create a pip wrapper to show useful info like pip list and also install PyPI packages from GIMP to GIMP Python environment.
  • Define proper licence in the repo. → GNU GPL v3 added.
Owner
Ismael Benito
Assistant professor and Predoctoral researcher at @unibarcelona.
Ismael Benito
Fonts used to be an install-and-forget thing, but many of are now updated regularly.

Your font manager. Fonts used to be an install-and-forget thing, but many of are now updated regularly. fontman helps you keep track of the fonts you

Nico Schlömer 20 Feb 07, 2022
This an Anki add on that automatically converts Notion notes into Anki flash cards. Currently in development!

NotionFlash This is an Anki add on in development that will allow automatically convert your Notion study notes into Anki flash cards. The Anki deck c

Neeraj Patel 10 Oct 07, 2022
aaencode for python,把python代码转换为颜文字

py-aaencode aaencode for python,把python代码转换为颜文字 compile.py: 将python编译成颜文字,编译结果有随机性,可以选择BPE词表压缩代码 compile_min.py: 最小化的编译器 compiled_min.txt: 编译得到的最小的com

11 Dec 30, 2021
Package pyVHR is a comprehensive framework for studying methods of pulse rate estimation relying on remote photoplethysmography (rPPG)

Package pyVHR (short for Python framework for Virtual Heart Rate) is a comprehensive framework for studying methods of pulse rate estimation relying on remote photoplethysmography (rPPG)

PHUSE Lab 261 Jan 03, 2023
VCM EE1.2 P-layer feature map anchor generation 137th MPEG-VCM

VCM EE1.2 P-layer feature map anchor generation 137th MPEG-VCM

IPSL 6 Oct 18, 2022
A (hopefully) considerably copious collection of classical cipher crackers

ClassicalCipherCracker A (hopefully) considerably copious collection of classical cipher crackers Written in Python3 (and run with PyPy) TODOs Write a

Stanley Zhong 2 Feb 22, 2022
A QGIS integration plugin for Kart repositories

QGIS Kart Plugin A plugin to work with Kart repositories Installation The Kart plugin is available in the QGIS Plugins server. To install the latest v

Koordinates 27 Jan 04, 2023
Assembly example for CadQuery

Spindle and vacuum attachment This is a model of the vacuum attachment for my Workbee CNC router. There is a mist spray coming from the left hand side

Marcus Boyd 20 Sep 16, 2022
Your Google Recon is Now Automated

GRecon : GRecon (Greei-Conn) is a simple python tool that automates the process of Google Based Recon AKA Google Dorking The current Version 1.0 Run 7

adnane-tebbaa 189 Dec 21, 2022
El_Binario - A converter for Binary, Decimal, Hexadecimal and Octal numbers

El_Binario El_Binario es un conversor de números Binarios, Decimales, Hexadecima

2 Jan 28, 2022
Python meta class and abstract method library with restrictions.

abcmeta Python meta class and abstract method library with restrictions. This library provides a restricted way to validate abstract methods. The Pyth

Morteza NourelahiAlamdari 8 Dec 14, 2022
Python implementation of the Learning Time-Series Shapelets method, that learns a shapelet-based time-series classifier with gradient descent.

shaplets Python implementation of the Learning Time-Series Shapelets method by Josif Grabocka et al., that learns a shapelet-based time-series classif

Mohamed Haseeb 187 Dec 14, 2022
Run CodeServer on Google Colab using Inlets in less than 60 secs using your own domain.

Inlets Colab Run CodeServer on Colab using Inlets in less than 60 secs using your own domain. Features Optimized for Inlets/InletsPro Use your own Cus

2 Dec 30, 2021
Uma versão em Python/Ursina do aplicativo Real Drum (android).

Real Drum Descrição Esta é uma versão alternativa feita em Python com a engine Ursina do aplicatio Real Drum (presente no Google Play Store). Como exe

hayukimori 5 Aug 20, 2022
The code for 2021 MGTV AI Challenge Anti Stealing Link, and the online result ranks 10th.

赛题介绍 芒果TV-第二届“马栏山杯”国际音视频算法大赛-防盗链 随着业务的发展,芒果的视频内容也深受网友的喜欢,不少视频网站和应用开始盗播芒果的视频内容,盗链网站不经过芒果TV的前端系统,跳过广告播放,且消耗大量的服务器、带宽资源,直接给公司带来了巨大的经济损失,因此防盗链在日常运营中显得尤为重要

tongji40 16 Jun 17, 2022
A smart personal companion and health assistant.

Steps to Install : Clone the repository Go to ResQ-Sources Execute ResQ-Lite.py --: Manual Controls : DanceRobot.py --: You can call functions like fo

Tuhinadri Banerjee 1 May 25, 2022
A simple PID tuner and simulator.

PIDtuner-V0.1 PlantPy PID tuner version 0.1 Features Supports first order and ramp process models. Supports Proportional action on PV or error or a sp

3 Jun 23, 2022
Example python package with pybind11 cpp extension

Developing C++ extension in Python using pybind11 This is a summary of the commands used in the tutorial.

55 Sep 04, 2022
Python implementation of the ASFLIP advection method

This is a python implementation of the ASFLIP advection method . We would like to hear from you if you appreciate this work.

Raymond Yun Fei 133 Nov 13, 2022
A partial-transpiler that converts a subset of Python to the Folders esoteric programming language

Py2Folders A partial-transpiler that converts a subset of Python to the Folders esoteric programming language Folders Folders is an esoteric programmi

Daniel Johnson 1 Dec 23, 2021