ninia / jep

Embed Python in Java
Other
1.3k stars 147 forks source link

Importing tensorflow in python script imports the Java Tensorflow library and not python's #377

Closed priyadarshi9 closed 2 years ago

priyadarshi9 commented 2 years ago

Describe the problem I am trying to run a python script from java with the below import statement.

import tensorflow as tf

When I run this script using jep, it imports the java tensorflow library ( mavan's tensorflow library is a dependency in the java project) and not python's tensorflow library. Then, the below import fails.

from tensorflow import keras

Exception: jep.JepException: <class 'ImportError'>: tensorflow.keras at /Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/site-packages/jep/java_import_hook.getattr(java_import_hook.py:57) at /Users/kpriyadarsh/amelia/ameliav3/ameliav3/amelia-nlp-api-impl/src/main/java/net/ipsoft/amelia/nlp/ml/wrapper/bert_model_trainer.(bert_model_trainer.py:16) at .(:1) at jep.Jep.exec(Native Method) at jep.Jep.exec(Jep.java:339) at com.roberta.BertTrainer.train(BertTrainer.java:55) at com.roberta.TrainerRunner.main(TrainerRunner.java:52) Caused by: java.lang.ClassNotFoundException: tensorflow.keras at java.base/jdk.internal.loader.BuiltinClassLoader.loadClass(BuiltinClassLoader.java:581) at java.base/jdk.internal.loader.ClassLoaders$AppClassLoader.loadClass(ClassLoaders.java:178) at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:522) ... 4 more

How can I stop jep from trying to load the java tensorflow dependency and make it import the python's tensorflow library. Any help would be appreciated. Environment (please complete the following information):

bsteffensmeier commented 2 years ago

The ClassEnquirer is responsible for determining which java packages can be imported into python. You will need to set a custom ClassEnquirer on your JepConfig that returns false when tensorflow is passed to isJavaPackage, You could try the NamingConventionClassEnquirer that comes with jep but if that doesn't work for you you may need to implement the interface yourself to get the desired behavior.

priyadarshi9 commented 2 years ago

Thanks, I implemented the ClassEnquirer and it works now. Thank you very much!