Install new Python modules from within Addon (without sudo/admin privileges)
Thanks to all the help, I was able to piece together a fully automatic solution that works at least on my system (tests on other Linux and Windows machines planned). It looks something like this:
import bpy
import sys
import importlib
import subprocess

# Blender's Python executable
pybin = bpy.app.binary_path_python

def add_user_site():
    # Locate users site-packages (writable)
    user_site = subprocess.check_output([pybin, &quot;-m&quot;, &quot;site&quot;, &quot;--user-site&quot;])
    user_site = user_site.decode(&quot;utf8&quot;).rstrip(&quot;\n&quot;)   # Convert to string and remove line-break
    # Add user packages to sys.path (if it exits)
    user_site_exists = user_site is not None
    if user_site not in sys.path and user_site_exists:
        sys.path.append(user_site)
    return user_site_exists

def enable_pip():
    if importlib.util.find_spec(&quot;pip&quot;) is None:
        subprocess.check_call([pybin, &quot;-m&quot;, &quot;ensurepip&quot;, &quot;--user&quot;])
        subprocess.check_call([pybin, &quot;-m&quot;, &quot;pip&quot;, &quot;install&quot;, &quot;--upgrade&quot;, &quot;pip&quot;, &quot;--user&quot;])
    
def install_module(module : str):
    if importlib.util.find_spec(module) is None:
        subprocess.check_call([pybin, &quot;-m&quot;, &quot;pip&quot;, &quot;install&quot;, module, &quot;--user&quot;])

user_site_added = add_user_site()
enable_pip()
# All the modules you need, that don't come shipped with Blender
modules = [&quot;module1&quot;, &quot;module2&quot;, ...] 
for module in modules:
    install_module(module)
# If there was no user-site before...
if not user_site_added:
    add_user_site()