I am currently developing a Python library under an MIT license (let's call it
mylib). I have, however, come across what may be a minor hurdle. I want to include an optional GPL-licensed dependency.
I have three circumstances. Consider two libraries,
mitlib provide the same functionality, but
mitlib is licensed under an MIT license and
gpllib under a GPL license.
Circumstance 1: I have a function with the signature
from mitlib import utility_func def func(x, use_gpl=False): if use_gpl: try: from gpllib import utility_func # Overwrite mitlib.utility_func in this scope only except ImportError: raise ImportError( "gpllib is not installed, but it is needed to run func with use_gpl=True. " "Install gpllib by running pip install gpllib." ) return utility_func(x)
To my understanding (based on Optional GPL dependency in commercial Python application and that this is almost what
scipy.sparse.linalg.use_solver does), this approach allows me to license
mylib under a MIT license , since I do not actually copy any code from
Circumstance 2: There is no permissively licensed alternative for
gpllib, so my function has the signature
try: from gpllib import utility_func except ImportError: HAS_GPLLIB = False else: HAS_GPLLIB = True def func(x): if not HAS_GPLLIB: raise RuntimeError("Cannot run func without installing gpllib first. To install, run pip install gpllib.") return utility_func(x)
This is, to my understanding, more complicated (based on: Can I license Python project under 3-clause BSD while it has GPL-based dependencies).
mylib now directly depends on
func is only a small part of
mylib that only some power-users will use, and not an integral part of my library. Also, the rest of
mylib will still work without installing any GPL-licensed code. I could, in fact, move all code that depend on
gpllib GPL-licensed plugin library. However this would fragment the codebase further, and I would prefer not doing this. Can I have all code in
mylib, or should I separate it into
mylib and a GPL-licensed plugin
Circumstance 3: My library is fully MIT-licensed, however, I have an example script that uses GPL-licensed code. Can I then license only the example script with a GPL-license?