Skip to content
Ben Steffensmeier edited this page Dec 16, 2023 · 28 revisions
What Python modules does Jep work with?
  • Jep should work with any pure Python modules. CPython extensions and Cython modules may or may not work correctly, it depends on how they were coded. There are various techniques to try and overcome some of the complications of CPython extensions, please see the Workarounds for CPython Extensions page.
Does Jep work with _____ CPython extension?
  • Jep works with a variety of CPython extensions. Developers have reported that Jep works with numpy, scipy, pandas, tensorflow, matplotlib, cvxpy, and more. Please let us know what other CPython extensions you are using with Jep or update this list.
Is Jep a good fit for my project?
  • That's a complex question. It depends on your project's requirements, but here's a simplification of the question. Do you want to run a Java process or a Python process?
    • Java
      • Do you need to use CPython modules (e.g. numpy)?
        • Yes: Jep is a good fit because we strive to work well with native CPython modules.
    • Python
      • Sinces Jep embeds CPython, it can run Python code just like other Python interpreters. But it cannot be launched from a Python process (we may add this in the future). If you want access to Java from a Python process, consider the following projects:
How do I fix Unsatisfied Link Error: no jep in java.library.path?
  • This error informs you that the Java process cannot find Jep's built C library. The name of the library is somewhat platform dependent, it is usually libjep.so on Linux, libjep.jnilib on OS X, and jep.dll on Windows. There are a few different ways to fix the problem:

    1. New in version 3.8: Jep will try harder to find the native library for you if you set the PYTHONHOME environment variable. When using Anaconda, set PYTHONHOME to your Anaconda installation directory, e.g. $(HOME)/anaconda3.
    2. Place the shared library where Python has its other shared libraries. This is usually python/lib with *nix systems and python/dlls with Windows systems.
    3. Set an environment variable that tells Java the directory of the Jep shared library.
      • On Linux, set LD_LIBRARY_PATH.
      • On OS X, set DYLD_LIBRARY_PATH.
      • On Windows, set PATH.
    4. Pass the argument -Djava.library.path to your Java process with the location of the Jep shared library.
    5. New in version 3.9: You can set the absolute path of the native jep library in code by using MainInterpreter.setJepLibraryPath(String absolutePath);
  • See http://stackoverflow.com/questions/20038789/default-java-library-path for more information.

  • An example to automatically load the Jep's C library is at https://gist.github.com/vwxyzjn/c054bae6dfa6f80e6c663df70347e238

Is Jep available through Maven?
  • The jars are available through Maven, the native library is not. Look at the pom.xml file to find the groupId is black.ninia and the artifactId is jep.
Does Jep work on Android?
  • We haven't tried it yet. In theory it should possible, but there may be some challenges to overcome. If you try this, we'd love to hear about it and will gladly accept contributions to make Jep work well on more platforms.
What Java UI frameworks does Jep support?
  • Jep has been run with Swing and SWT.

Does Jep work with OSGi?

  • Yes.
Why does eval(String) return a boolean instead of an Object of the result?
  • eval(String) was originally written to support interactive mode or non-interactive mode (multiple statements or a single statement, see javadoc), so the boolean return value is whether or not the statement was actually executed. There is also an overhead of always returning the result, especially if code is making multiple calls to eval(String) and doesn't need the results. To change the method signature now would potentially break compatibility with a number of applications.
  • getValue(String) is almost identical in the C code to eval(String) and will return the result of the evaluation, and can be used instead of eval where desired. For example:
    // evaluates and discards the result
    jep.eval("2 + 4");

    // evaluates and places the results in x
    jep.eval("x = 2 + 4");
    Integer x = (Integer) jep.getValue("x");

    // evaluates and returns the results
    Integer y = (Integer) jep.getValue("2 + 4");
How do I fix Fatal Python Error when Jep starts up?
  • If you see fatal Python errors when first using Jep, that often implies the PATH or LD_LIBRARY_PATH environment variables are incorrect or inconsistent. This is often seen if multiple versions of Python are installed and/or Jep was built with a different version of Python than it is running with.
Does Jep work with alternative Python distributions such as Anaconda, PyPy, Stackless, or Jython?
  • Jep is only officially supported and routinely tested using the CPython reference distribution. There are just too many different combinations of Java, Python, and OS variants to be able to support them all. For Windows the versions on AppVeyor are used for development and testing. For OS X the version available on Travis CI is used for development and testing. The default Python on most *nix variants is almost always a compatible CPython build.
    • Many Jep users have reported Jep works with Anaconda.
  • Other versions of Python may work but they do not receive routine testing and they may require additional effort to ensure that the correct versions of all native libraries can be loaded. If you are having trouble you can try Google or the Mailing List to see if there are other users with a similar setup.
Does Jep work with Scala?
  • Yes.
Can I start new Python threads from Jep?
  • Yes, however there are currently a few limitations
    1. You must ensure that all Python threads have completed before closing Jep.
    2. You cannot access Java from any new Python threads.
Is it safe to execute untrusted python expressions with Jep
  • Jep does not provide any sand-boxing of the executed Python so code will have the full power of Python including the ability to read/write files and start new processes. In general executing Python code from jep is as safe as running the code from the eval() function in Python. There are numerous articles and discussions online about how safe eval() is, I find this stackoverflow post provides a concise explanation and it contains many links for more information.
Who is using Jep?