pyjnius/jnius_config.py

113 lines
3.1 KiB
Python

__all__ = ('set_options', 'add_options', 'get_options',
'set_classpath', 'add_classpath', 'get_classpath',
'expand_classpath')
import platform
if platform.system() == 'Windows':
split_char = ';'
else:
split_char = ':'
vm_running = False
vm_started_at = None
options = []
classpath = None
def check_vm_running():
"""Raises a ValueError if the VM is already running."""
if vm_running:
raise ValueError("VM is already running, can't set classpath/options; VM started at" + vm_started_at)
def set_options(*opts):
"""Sets the list of options to the JVM. Removes any previously set options."""
check_vm_running()
global options
options = list(opts)
def add_options(*opts):
"""Appends options to the list of VM options."""
check_vm_running()
global options
options.extend(opts)
def get_options():
"""Retrieves the current list of VM options."""
global options
return list(options)
def set_classpath(*path):
"""
Sets the classpath for the JVM to use. Replaces any existing classpath, overriding the CLASSPATH environment variable.
"""
check_vm_running()
global classpath
classpath = list(path)
def add_classpath(*path):
"""
Appends items to the classpath for the JVM to use.
Replaces any existing classpath, overriding the CLASSPATH environment variable.
"""
check_vm_running()
global classpath
if classpath is None:
classpath = list(path)
else:
classpath.extend(path)
def get_classpath():
"Retrieves the classpath the JVM will use."
from os import environ
from os.path import realpath
import sys
global classpath
# add a path to java classes packaged with jnius
if sys.version_info >= (3, 9):
from contextlib import ExitStack
import importlib.resources
import atexit
# see https://importlib-resources.readthedocs.io/en/latest/migration.html#pkg-resources-resource-filename
file_manager = ExitStack()
atexit.register(file_manager.close)
# importlib.resources.files is only available from Python 3.9
# use https://github.com/python/importlib_resources/issues/60 not __name__ as jnius_config.py is not a package
resource_path = importlib.resources.files('jnius') / 'src'
return_classpath = [ str(resource_path) ]
file_manager.enter_context(importlib.resources.as_file(resource_path))
else:
from pkg_resources import resource_filename
return_classpath = [realpath(resource_filename(__name__, 'jnius/src'))]
if classpath is not None:
return_classpath = classpath + return_classpath
elif 'CLASSPATH' in environ:
return_classpath = environ['CLASSPATH'].split(split_char) + return_classpath
else:
return_classpath = [realpath('.')] + return_classpath
return return_classpath
def expand_classpath():
from glob import glob
paths = []
# deal with wildcards
for path in get_classpath():
if not path.endswith('*'):
paths.append(path)
else:
paths.extend(glob(path + '.[Jj][Aa][Rr]'))
return split_char.join(paths)