尝试使用Jython

问题描述

我有一种情况,我需要使用intelliJ IDE将python库(一个单独的python项目)导入到java springboot应用程序中

我正在尝试一个示例项目,其中使用jython独立jar可以集成并执行一个python文件,并将结果返回给我的控制器,但是如果python文件正在导入另一个python文件,则解释第一个python文件时,在import语句行上引发importerror。下面是我尝试过的代码

pom.xml

<dependency>
            <groupId>org.python</groupId>
            <artifactId>jython-standalone</artifactId>
            <version>2.7.2</version>
</dependency>

java src 文件

Addition.java

package com.example.javapython;

public interface Addition {
    Integer getSum(int a,int b);

}

AdditionFactory.java

package com.example.javapython;

import org.python.core.PyObject;
import org.python.util.pythoninterpreter;
import org.springframework.beans.factory.factorybean;

public class AdditionFactory implements factorybean<Addition> {

    @Override
    public Addition getobject() throws Exception {
        pythoninterpreter interpreter = new pythoninterpreter();
        interpreter.execfile("python\\addition_python.py");
        PyObject buildingObject = interpreter.get("AdditionPython").__call__();
        return (Addition) buildingObject.__tojava__(Addition.class);
    }

    @Override
    public Class<?> getobjectType() {
        return Addition.class;
    }

    @Override
    public boolean isSingleton() {
        return false;
    }

}

Application.java

package com.example.javapython;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.annotation.Bean;

@SpringBootApplication
public class Application {

    public static void main(String[] args) {
        SpringApplication.run(Application.class,args);
    }

    @Bean(name = "AdditionFactory")
    public AdditionFactory additionFactory() {
        AdditionFactory additionFactory = new AdditionFactory();
        return additionFactory;
    }

    @Bean(name = "AdditionPython")
    public Addition additionPython() throws Exception {
        Addition factory = additionFactory().getobject();
        return factory;
    }

}

JavaPythonController.java

package com.example.javapython;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class JavaPythonController {

    @Autowired
    @Qualifier("AdditionPython")
    private Addition addition;

    @RequestMapping("/javapython/")
    public Integer index() {
        int c = addition.getSum(10,5);
        return c;
    }
}

python文件添加添加了所有python文件的java项目中。

初始化 .py

empty init file

addition_python.py 当注释first_addition_py的导入时,该文件将执行而没有任何问题,如果我们取消注释注释行的注释,则会抛出 ImportError:没有名为first_addition_py

的模块
from com.example.javapython import Addition
#from first_addition_py import *


class AdditionPython(Addition):

    def getSum(self,a,b):
        print(a+b)
        #first_add_py("test")
        return a+b

first_addition_py.py

class first_add_py:
    def __init__(self,testString):
        print(testString)
        print("testing multiple python classes")

当我们尝试在第一个python文件中导入其他python文件时遇到错误


2020-08-25 08:58:25.602  WARN 12448 --- [           main] ConfigServletWebServerApplicationContext : Exception encountered during context initialization - cancelling refresh attempt: org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'javaPythonController': Unsatisfied dependency expressed through field 'addition'; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'AdditionPython' defined in com.example.javapython.Application: Bean instantiation via factory method Failed; nested exception is org.springframework.beans.BeanInstantiationException: Failed to instantiate [com.example.javapython.Addition]: Factory method 'additionPython' threw exception; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'AdditionFactory': factorybean threw exception on object creation; nested exception is Traceback (most recent call last):
  File "python\addition_python.py",line 2,in <module>
    from first_addition_py import *
ImportError: No module named first_addition_py

2020-08-25 08:58:25.607  INFO 12448 --- [           main] o.apache.catalina.core.StandardService   : Stopping service [Tomcat]
2020-08-25 08:58:25.618  INFO 12448 --- [           main] ConditionEvaluationReportLoggingListener : 

Error starting ApplicationContext. To display the conditions report re-run your application with 'debug' enabled.
2020-08-25 08:58:25.631 ERROR 12448 --- [           main] o.s.boot.SpringApplication               : Application run Failed

org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'javaPythonController': Unsatisfied dependency expressed through field 'addition'; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'AdditionPython' defined in com.example.javapython.Application: Bean instantiation via factory method Failed; nested exception is org.springframework.beans.BeanInstantiationException: Failed to instantiate [com.example.javapython.Addition]: Factory method 'additionPython' threw exception; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'AdditionFactory': factorybean threw exception on object creation; nested exception is Traceback (most recent call last):
  File "python\addition_python.py",in <module>
    from first_addition_py import *
ImportError: No module named first_addition_py

    at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor$AutowiredFieldElement.inject(AutowiredAnnotationBeanPostProcessor.java:639) ~[spring-beans-5.2.0.RELEASE.jar:5.2.0.RELEASE]
    at org.springframework.beans.factory.annotation.InjectionMetadata.inject(InjectionMetadata.java:116) ~[spring-beans-5.2.0.RELEASE.jar:5.2.0.RELEASE]
    at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor.postProcessproperties(AutowiredAnnotationBeanPostProcessor.java:397) ~[spring-beans-5.2.0.RELEASE.jar:5.2.0.RELEASE]
    at org.springframework.beans.factory.support.AbstractAutowireCapablebeanfactory.populateBean(AbstractAutowireCapablebeanfactory.java:1429) ~[spring-beans-5.2.0.RELEASE.jar:5.2.0.RELEASE]
    at org.springframework.beans.factory.support.AbstractAutowireCapablebeanfactory.doCreateBean(AbstractAutowireCapablebeanfactory.java:594) ~[spring-beans-5.2.0.RELEASE.jar:5.2.0.RELEASE]
    at org.springframework.beans.factory.support.AbstractAutowireCapablebeanfactory.createBean(AbstractAutowireCapablebeanfactory.java:517) ~[spring-beans-5.2.0.RELEASE.jar:5.2.0.RELEASE]
    at org.springframework.beans.factory.support.Abstractbeanfactory.lambda$doGetBean$0(Abstractbeanfactory.java:323) ~[spring-beans-5.2.0.RELEASE.jar:5.2.0.RELEASE]
    at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:222) ~[spring-beans-5.2.0.RELEASE.jar:5.2.0.RELEASE]
    at org.springframework.beans.factory.support.Abstractbeanfactory.doGetBean(Abstractbeanfactory.java:321) ~[spring-beans-5.2.0.RELEASE.jar:5.2.0.RELEASE]
    at org.springframework.beans.factory.support.Abstractbeanfactory.getBean(Abstractbeanfactory.java:202) ~[spring-beans-5.2.0.RELEASE.jar:5.2.0.RELEASE]
    at org.springframework.beans.factory.support.DefaultListablebeanfactory.preInstantiateSingletons(DefaultListablebeanfactory.java:879) ~[spring-beans-5.2.0.RELEASE.jar:5.2.0.RELEASE]
    at org.springframework.context.support.AbstractApplicationContext.finishbeanfactoryInitialization(AbstractApplicationContext.java:878) ~[spring-context-5.2.0.RELEASE.jar:5.2.0.RELEASE]
    at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:550) ~[spring-context-5.2.0.RELEASE.jar:5.2.0.RELEASE]
    at org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext.refresh(ServletWebServerApplicationContext.java:141) ~[spring-boot-2.2.0.RELEASE.jar:2.2.0.RELEASE]
    at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:747) [spring-boot-2.2.0.RELEASE.jar:2.2.0.RELEASE]
    at org.springframework.boot.SpringApplication.refreshContext(SpringApplication.java:397) [spring-boot-2.2.0.RELEASE.jar:2.2.0.RELEASE]
    at org.springframework.boot.SpringApplication.run(SpringApplication.java:315) [spring-boot-2.2.0.RELEASE.jar:2.2.0.RELEASE]
    at org.springframework.boot.SpringApplication.run(SpringApplication.java:1226) [spring-boot-2.2.0.RELEASE.jar:2.2.0.RELEASE]
    at org.springframework.boot.SpringApplication.run(SpringApplication.java:1215) [spring-boot-2.2.0.RELEASE.jar:2.2.0.RELEASE]
    at com.example.javapython.Application.main(Application.java:11) [classes/:na]
Caused by: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'AdditionPython' defined in com.example.javapython.Application: Bean instantiation via factory method Failed; nested exception is org.springframework.beans.BeanInstantiationException: Failed to instantiate [com.example.javapython.Addition]: Factory method 'additionPython' threw exception; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'AdditionFactory': factorybean threw exception on object creation; nested exception is Traceback (most recent call last):
  File "python\addition_python.py",in <module>
    from first_addition_py import *
ImportError: No module named first_addition_py

    at org.springframework.beans.factory.support.ConstructorResolver.instantiate(ConstructorResolver.java:645) ~[spring-beans-5.2.0.RELEASE.jar:5.2.0.RELEASE]
    at org.springframework.beans.factory.support.ConstructorResolver.instantiateUsingFactoryMethod(ConstructorResolver.java:475) ~[spring-beans-5.2.0.RELEASE.jar:5.2.0.RELEASE]
    at org.springframework.beans.factory.support.AbstractAutowireCapablebeanfactory.instantiateUsingFactoryMethod(AbstractAutowireCapablebeanfactory.java:1338) ~[spring-beans-5.2.0.RELEASE.jar:5.2.0.RELEASE]
    at org.springframework.beans.factory.support.AbstractAutowireCapablebeanfactory.createBeanInstance(AbstractAutowireCapablebeanfactory.java:1177) ~[spring-beans-5.2.0.RELEASE.jar:5.2.0.RELEASE]
    at org.springframework.beans.factory.support.AbstractAutowireCapablebeanfactory.doCreateBean(AbstractAutowireCapablebeanfactory.java:557) ~[spring-beans-5.2.0.RELEASE.jar:5.2.0.RELEASE]
    at org.springframework.beans.factory.support.AbstractAutowireCapablebeanfactory.createBean(AbstractAutowireCapablebeanfactory.java:517) ~[spring-beans-5.2.0.RELEASE.jar:5.2.0.RELEASE]
    at org.springframework.beans.factory.support.Abstractbeanfactory.lambda$doGetBean$0(Abstractbeanfactory.java:323) ~[spring-beans-5.2.0.RELEASE.jar:5.2.0.RELEASE]
    at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:222) ~[spring-beans-5.2.0.RELEASE.jar:5.2.0.RELEASE]
    at org.springframework.beans.factory.support.Abstractbeanfactory.doGetBean(Abstractbeanfactory.java:321) ~[spring-beans-5.2.0.RELEASE.jar:5.2.0.RELEASE]
    at org.springframework.beans.factory.support.Abstractbeanfactory.getBean(Abstractbeanfactory.java:202) ~[spring-beans-5.2.0.RELEASE.jar:5.2.0.RELEASE]
    at org.springframework.beans.factory.config.DependencyDescriptor.resolveCandidate(DependencyDescriptor.java:276) ~[spring-beans-5.2.0.RELEASE.jar:5.2.0.RELEASE]
    at org.springframework.beans.factory.support.DefaultListablebeanfactory.doResolveDependency(DefaultListablebeanfactory.java:1287) ~[spring-beans-5.2.0.RELEASE.jar:5.2.0.RELEASE]
    at org.springframework.beans.factory.support.DefaultListablebeanfactory.resolveDependency(DefaultListablebeanfactory.java:1207) ~[spring-beans-5.2.0.RELEASE.jar:5.2.0.RELEASE]
    at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor$AutowiredFieldElement.inject(AutowiredAnnotationBeanPostProcessor.java:636) ~[spring-beans-5.2.0.RELEASE.jar:5.2.0.RELEASE]
    ... 19 common frames omitted
Caused by: org.springframework.beans.BeanInstantiationException: Failed to instantiate [com.example.javapython.Addition]: Factory method 'additionPython' threw exception; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'AdditionFactory': factorybean threw exception on object creation; nested exception is Traceback (most recent call last):
  File "python\addition_python.py",in <module>
    from first_addition_py import *
ImportError: No module named first_addition_py

    at org.springframework.beans.factory.support.SimpleInstantiationStrategy.instantiate(SimpleInstantiationStrategy.java:185) ~[spring-beans-5.2.0.RELEASE.jar:5.2.0.RELEASE]
    at org.springframework.beans.factory.support.ConstructorResolver.instantiate(ConstructorResolver.java:640) ~[spring-beans-5.2.0.RELEASE.jar:5.2.0.RELEASE]
    ... 32 common frames omitted
Caused by: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'AdditionFactory': factorybean threw exception on object creation; nested exception is Traceback (most recent call last):
  File "python\addition_python.py",in <module>
    from first_addition_py import *
ImportError: No module named first_addition_py

    at org.springframework.beans.factory.support.factorybeanRegistrySupport.doGetobjectFromfactorybean(factorybeanRegistrySupport.java:178) ~[spring-beans-5.2.0.RELEASE.jar:5.2.0.RELEASE]
    at org.springframework.beans.factory.support.factorybeanRegistrySupport.getobjectFromfactorybean(factorybeanRegistrySupport.java:135) ~[spring-beans-5.2.0.RELEASE.jar:5.2.0.RELEASE]
    at org.springframework.beans.factory.support.Abstractbeanfactory.getobjectForBeanInstance(Abstractbeanfactory.java:1818) ~[spring-beans-5.2.0.RELEASE.jar:5.2.0.RELEASE]
    at org.springframework.beans.factory.support.AbstractAutowireCapablebeanfactory.getobjectForBeanInstance(AbstractAutowireCapablebeanfactory.java:1266) ~[spring-beans-5.2.0.RELEASE.jar:5.2.0.RELEASE]
    at org.springframework.beans.factory.support.Abstractbeanfactory.doGetBean(Abstractbeanfactory.java:260) ~[spring-beans-5.2.0.RELEASE.jar:5.2.0.RELEASE]
    at org.springframework.beans.factory.support.Abstractbeanfactory.getBean(Abstractbeanfactory.java:202) ~[spring-beans-5.2.0.RELEASE.jar:5.2.0.RELEASE]
    at org.springframework.context.annotation.ConfigurationClassEnhancer$BeanMethodInterceptor.lambda$createcglibProxyForfactorybean$1(ConfigurationClassEnhancer.java:572) ~[spring-context-5.2.0.RELEASE.jar:5.2.0.RELEASE]
    at com.example.javapython.AdditionFactory$$EnhancerBySpringcglib$$c6b6d160.getobject(<generated>) ~[classes/:na]
    at com.example.javapython.Application.additionPython(Application.java:25) [classes/:na]
    at com.example.javapython.Application$$EnhancerBySpringcglib$$623c5a02.cglib$additionPython$1(<generated>) ~[classes/:na]
    at com.example.javapython.Application$$EnhancerBySpringcglib$$623c5a02$$FastClassBySpringcglib$$253984a2.invoke(<generated>) ~[classes/:na]
    at org.springframework.cglib.proxy.MethodProxy.invokeSuper(MethodProxy.java:244) ~[spring-core-5.2.0.RELEASE.jar:5.2.0.RELEASE]
    at org.springframework.context.annotation.ConfigurationClassEnhancer$BeanMethodInterceptor.intercept(ConfigurationClassEnhancer.java:363) ~[spring-context-5.2.0.RELEASE.jar:5.2.0.RELEASE]
    at com.example.javapython.Application$$EnhancerBySpringcglib$$623c5a02.additionPython(<generated>) ~[classes/:na]
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[na:1.8.0_251]
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) ~[na:1.8.0_251]
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[na:1.8.0_251]
    at java.lang.reflect.Method.invoke(Method.java:498) ~[na:1.8.0_251]
    at org.springframework.beans.factory.support.SimpleInstantiationStrategy.instantiate(SimpleInstantiationStrategy.java:154) ~[spring-beans-5.2.0.RELEASE.jar:5.2.0.RELEASE]
    ... 33 common frames omitted
Caused by: org.python.core.PyException: null
    at org.python.core.Py.ImportError(Py.java:328) ~[jython-standalone-2.7.0.jar:na]
    at org.python.core.imp.import_first(imp.java:877) ~[jython-standalone-2.7.0.jar:na]
    at org.python.core.imp.import_module_level(imp.java:972) ~[jython-standalone-2.7.0.jar:na]
    at org.python.core.imp.importName(imp.java:1062) ~[jython-standalone-2.7.0.jar:na]
    at org.python.core.ImportFunction.__call__(__builtin__.java:1280) ~[jython-standalone-2.7.0.jar:na]
    at org.python.core.PyObject.__call__(PyObject.java:431) ~[jython-standalone-2.7.0.jar:na]
    at org.python.core.__builtin__.__import__(__builtin__.java:1232) ~[jython-standalone-2.7.0.jar:na]
    at org.python.core.imp.importAll(imp.java:1182) ~[jython-standalone-2.7.0.jar:na]
    at org.python.pycode._pyx0.f$0(python\addition_python.py:5) ~[na:na]
    at org.python.pycode._pyx0.call_function(python\addition_python.py) ~[na:na]
    at org.python.core.PyTableCode.call(PyTableCode.java:167) ~[jython-standalone-2.7.0.jar:na]
    at org.python.core.PyCode.call(PyCode.java:18) ~[jython-standalone-2.7.0.jar:na]
    at org.python.core.Py.runcode(Py.java:1386) ~[jython-standalone-2.7.0.jar:na]
    at org.python.core.__builtin__.execfile_flags(__builtin__.java:535) ~[jython-standalone-2.7.0.jar:na]
    at org.python.util.pythoninterpreter.execfile(pythoninterpreter.java:286) ~[jython-standalone-2.7.0.jar:na]
    at com.example.javapython.AdditionFactory.getobject(AdditionFactory.java:14) ~[classes/:na]
    at com.example.javapython.AdditionFactory.getobject(AdditionFactory.java:7) ~[classes/:na]
    at org.springframework.beans.factory.support.factorybeanRegistrySupport.doGetobjectFromfactorybean(factorybeanRegistrySupport.java:171) ~[spring-beans-5.2.0.RELEASE.jar:5.2.0.RELEASE]
    ... 51 common frames omitted


Process finished with exit code 1

如果我遗漏了某些东西(如何解决导入错误),或者可以通过除Jython之外的其他方法来实现,可以有人帮助我

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)