Class PrePy

java.lang.Object
org.python.core.PrePy
Direct Known Subclasses:
Py

public class PrePy extends Object
This class is part of the Jython run-time system, and contains only "pre-Python" data and methods that may safely be used before the type system is ready. The Jython type system springs into existence in response to a program's first use of any PyObject, for example when creating the first interpreter. When preparing an application (from the command line options, say) for creation of the first interpreter, it useful to defer type system creation until pre-Python configuration is complete. See PEP 432 for further rationale.

Creation of the type system may happen as a side effect of referring using (almost) any object from a class that statically refers to a PyObject, for example Py or PySystemState. The present class is intended to hold utility methods and configuration useful in the pre-Python phase.

  • Field Details

  • Constructor Details

    • PrePy

      public PrePy()
  • Method Details

    • levelFromVerbosity

      public static Level levelFromVerbosity(int verbosity)
      Translate from the traditional "verbosity" system to JUL Level. We allow Jython verbosity values beyond the conventional range, treating values <ERROR as ERROR (that is Level.SEVERE) and values >DEBUG (that is Level.FINE) as FINER, FINEST and ALL.
      Parameters:
      verbosity - any integer verbosity, where the runtime default MESSAGE = 1
      Returns:
      a corresponding level where the default MESSAGE produces Level.INFO.
    • verbosityFromLevel

      public static int verbosityFromLevel(Level level)
      Translate from JUL Level to equivalent in the traditional "verbosity" system. We return Jython verbosity values beyond the conventional range, enough to enumerate the Java standard levels (e.g FINER returns 4 and ALL returns 6 ).
      Parameters:
      level - java.util.logging.Level to translate.
      Returns:
      integer verbosity, where the runtime default INFO = 1
    • getLoggingLevel

      public static Level getLoggingLevel()
      Convenience function to get the effective level of Logger "org.python".
    • setLoggingLevel

      public static Level setLoggingLevel(Level newLevel)
      Set the level of the Jython logger "org.python" using the standard java.util.logging scale. For backward compatibility with the traditional "verbosity" system, make a corresponding setting of Options.verbose.
      Parameters:
      newLevel - to set
      Returns:
      previous logging level
    • increaseLoggingLevel

      public static void increaseLoggingLevel(int n)
      Adjust the level of the Jython logger "org.python" using the traditional "verbosity" system: the bigger the number, the lower the logging threshold. This is primarily for the command-line Jython, where each "-v" increases the verbosity by one, on the java.util.logging scale.
      Parameters:
      n - increment on the scale 1=INFO, 2=CONFIG, 3=FINE, ...
    • maybeWrite

      public static void maybeWrite(String type, String msg, int verbosity)
      Log a message at a specified level (if that level is not below the threshold).
    • writeError

      public static void writeError(String type, String msg)
      Submit a message to logging at the severity level ERROR.
    • writeWarning

      public static void writeWarning(String type, String msg)
      Submit a message to logging at the severity level WARNING.
    • writeMessage

      public static void writeMessage(String type, String msg)
      Submit a message to logging at the severity level MESSAGE.
    • writeComment

      public static void writeComment(String type, String msg)
      Submit a message to logging at the severity level COMMENT.
    • writeDebug

      public static void writeDebug(String type, String msg)
      Submit a message to logging at the severity level DEBUG.
    • getSystemProperties

      public static Properties getSystemProperties()
      Get the System properties if we are allowed to. Configuration values set via -Dprop=value to the java command will be found here. If a security manager prevents access, we will return a new (empty) object instead.
      Returns:
      System properties or a new Properties object
    • getSystemProperty

      public static String getSystemProperty(String key, String defaultValue)
      Get a System property if it is defined, not null, and we are allowed to access it, otherwise return the given default.
      Parameters:
      key - of the entry to return
      defaultValue - to return if null or disallowed
      Returns:
      property value or given default
    • isInteractive

      public static boolean isInteractive()
      Determine whether standard input is an interactive stream. If the Java system property python.launcher.tty is defined and equal to true or false, then that provides the result. This property is normally supplied by the launcher. In the absence of this certainty, we use haveConsole().
      Returns:
      true if (we think) standard input is an interactive stream
    • haveConsole

      public static boolean haveConsole()
      Return true iff the console is accessible through System.console().
    • isInteractive

      public static boolean isInteractive(InputStream fp, String filename)
      Check whether an input stream is interactive. This emulates CPython Py_FdIsInteractive within the constraints of pure Java. The input stream is considered ``interactive'' if either
      1. it is System.in and isInteractive() is true, or
      2. the -i flag was given (Options.interactive=true), and the filename associated with it is null or "<stdin>" or "???".
      Parameters:
      fp - stream (tested only for System.in)
      filename -
      Returns:
      true iff thought to be interactive
    • getDefaultExecutableName

      public static String getDefaultExecutableName()
      Infers the usual Jython executable name from the position of the jar-file returned by getJarFileName() by replacing the file name with "bin/jython". This is intended as an easy fallback for cases where sys.executable is None due to direct launching via the java executable.

      Note that this does not necessarily return the actual executable, but instead infers the place where it is usually expected to be. Use sys.executable to get the actual executable (may be None.

      Returns:
      usual Jython-executable as absolute path
    • getDefaultBinDir

      public static String getDefaultBinDir()
      Infers the usual Jython bin-dir from the position of the jar-file returned by getJarFileName() byr replacing the file name with "bin". This is intended as an easy fallback for cases where sys.executable is null due to direct launching via the java executable.

      Note that this does not necessarily return the actual bin-directory, but instead infers the place where it is usually expected to be.

      Returns:
      usual Jython bin-dir as absolute path
    • getJarFileName

      public static String getJarFileName()
      Utility-method to obtain the name (including absolute path) of the currently used jython-jar-file. Usually this is jython.jar, but can also be jython-dev.jar or jython-standalone.jar or something custom.
      Returns:
      the full name of the jar file containing this class, null if not available.
    • getJarFileNameFromURL

      public static String getJarFileNameFromURL(URL url)
      Return the path in the file system (as a string) of a JAR located using the URL of a class file that it contains. Classes in Java can be asked for the URL of their associated resources (including their own class definition), and so the caller of this method may present such a URL as the basis for locating the JAR from which it came.

      Three protocols are supported, Java JAR-file protocol, and two JBoss protocols "vfs" and "vfszip".

      The JAR-file protocol URL, which must be a jar:file: reference to a contained element (that is, it has a "!/" part) is able to identify an actual JAR in a file system that may then be opened using jarFile = new JarFile(jarFileName). The path to the JAR is returned. If the JAR is accessed by another mechanism (http: say) this will fail.

      The JBoss URL must be a reference to a class in vfs:<JAR>/org/python/core/, or the same thing using the vfszip: protocol, where <JAR> stands for the absolute path to the Jython JAR in VFS. There is no "!/" marker: in JBoss VFS a JAR is treated just like a directory and can no longer be opened as a JAR. The method essentially just swaps a VFS protocol for the Java file: protocol. The path returned will be correct only if this naive swap is valid.

      Parameters:
      url - into the JAR
      Returns:
      the file path or null in the event of a detectable error
    • getCommandResult

      public static String getCommandResult(String... command)
      Run a command as a sub-process and return as the result the first line of output that consists of more than white space. It returns "" on any kind of error.
      Parameters:
      command - as strings (as for ProcessBuilder)
      Returns:
      the first line with content, or ""
    • getCommandResultWindows

      public static String getCommandResultWindows(String... command)
      A specialised wrapper on getCommandResult(String...) for the Windows platform, where we have to consult the environment variable ComSpec to locate the command processor.
      Parameters:
      command - as strings (as for ProcessBuilder)
      Returns:
      the first line with content, or ""