问题描述
我有一种情况,我需要使用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 (将#修改为@)