How to resolve this: pyreportjasper: ImportError: DLL load failed while importing jpy: The specified module could not be found
How to resolve this: pyreportjasper: ImportError: DLL load failed while importing jpy: The specified module could not be found
我想将 Jasper Reports 与 python-flask 应用程序一起使用。
我已按照此页面上的安装说明进行操作:
https://pypi.org/project/pyreportjasper/
导入 jpy 行失败,我收到错误:
ImportError:导入 jpy 时 DLL 加载失败:找不到指定的模块。
我正在使用 32 位 python Python: 3.8.6rc1。
32 位 JDK: javac 1.8.0_261
当我 运行 pip install pyreportjasper 时,它说:要求已经满足:c:\users 中的 jpy....
有什么想法吗?
您似乎需要导入 jpyutil,然后在调用 import jpy 之前初始化 JVM。以下为我修复了这个错误。更近一步。
import jpyutil
jpyutil.init_jvm(jvm_maxmem='512M')
import jpy
更新:所以虽然上面的说法是正确的,但它并没有直接解决运行在项目页面上使用示例代码的问题:https://pypi.org/project/pyreportjasper/
当我深入研究代码时,我发现 jasperpy.py 试图在 __init__
方法是 运行 之前导入 jpy,因此在通过 [=13] 初始化 JVM 之前=] 方法调用。所以我编辑了 jasperpy.py 并将 import jpy 从第 14 行移动到第 56 行,直接在调用 jpyutil.init_jvm()
之后和调用 jpy.get_type('java.io.File')
之前,我能够成功 运行 Jasper 通过显示的示例代码从 python 报告。这是我的 jasperpy.py 现在的样子。
# -*- coding: utf-8 -*-
# GNU GENERAL PUBLIC LICENSE
#
# Copyright (c) 2020 Jadson Bonfim Ribeiro <contato@jadsonbr.com.br>
#
import os
import subprocess
import re
import xml.etree.ElementTree as ET
import tempfile
import jpyutil
#import jpy
import json
from requests import Request, Session
FORMATS = (
'pdf',
'rtf',
'xls',
'xlsx',
'docx',
'odt',
'ods',
'pptx',
'csv',
'html',
'xhtml',
'xml',
'jrprint',
)
EXECUTABLE = 'jasperstarter'
class JasperPy:
_FORMATS_JSON = ('pdf')
_FORMATS_METHODS_REQUEST = ('GET', 'POST', 'PUT')
def __init__(self, resource_dir=False, jvm_maxmem='512M', jvm_classpath=None):
self.WINDOWS = True if os.name == 'nt' else False
self.SCRIPT_DIR = os.path.abspath(os.path.dirname(__file__))
self.LIBS = os.path.join(self.SCRIPT_DIR, 'jasperstarter', 'lib')
if not os.path.isdir(self.LIBS):
raise NameError('Unable to find lib in {0}'.format(self.LIBS))
self.CLASSPATH = os.path.join(self.LIBS, 'jasperstarter.jar')
if not os.path.exists(self.CLASSPATH):
raise NameError('Unable to find jasperstarter in {0}'.format(self.LIBS))
if jvm_classpath is None:
jpyutil.init_jvm(jvm_maxmem=jvm_maxmem, jvm_classpath=[self.CLASSPATH])
else:
jpyutil.init_jvm(jvm_maxmem=jvm_maxmem, jvm_classpath=[self.CLASSPATH, jvm_classpath])
# IMPORT jpy HERE AFTER init_jvm
import jpy
self.jvFile = jpy.get_type('java.io.File')
self.jvArrays = jpy.get_type('java.util.Arrays')
self.jvReport = jpy.get_type('de.cenote.jasperstarter.Report')
self.jvConfig = jpy.get_type('de.cenote.jasperstarter.Config')
self.jvDsType = jpy.get_type('de.cenote.jasperstarter.types.DsType')
self.jvApplicationClasspath = jpy.get_type('de.cenote.tools.classpath.ApplicationClasspath')
self.jvHashMap = jpy.get_type('java.util.HashMap')
self.jvLocale = jpy.get_type('java.util.Locale')
self.jvJasperFillManager = jpy.get_type('net.sf.jasperreports.engine.JasperFillManager')
self.jvDb = jpy.get_type('de.cenote.jasperstarter.Db')
self.jvJsonQueryExecuterFactory = jpy.get_type('net.sf.jasperreports.engine.query.JsonQueryExecuterFactory')
self.jvJasperExportManager = jpy.get_type('net.sf.jasperreports.engine.JasperExportManager')
.
.
.
.
此文件位于 Lib\site-packages\pyreportjasper-2.0.2-py3.8.egg\pyreportjasper 下的 Python 目录中。虽然目前这是一个让它工作的 hack,但显然需要对包进行修复,我将尝试在 pyreportjasper github 页面上解决这个问题。
我想将 Jasper Reports 与 python-flask 应用程序一起使用。
我已按照此页面上的安装说明进行操作: https://pypi.org/project/pyreportjasper/
导入 jpy 行失败,我收到错误:
ImportError:导入 jpy 时 DLL 加载失败:找不到指定的模块。
我正在使用 32 位 python Python: 3.8.6rc1。 32 位 JDK: javac 1.8.0_261
当我 运行 pip install pyreportjasper 时,它说:要求已经满足:c:\users 中的 jpy....
有什么想法吗?
您似乎需要导入 jpyutil,然后在调用 import jpy 之前初始化 JVM。以下为我修复了这个错误。更近一步。
import jpyutil
jpyutil.init_jvm(jvm_maxmem='512M')
import jpy
更新:所以虽然上面的说法是正确的,但它并没有直接解决运行在项目页面上使用示例代码的问题:https://pypi.org/project/pyreportjasper/
当我深入研究代码时,我发现 jasperpy.py 试图在 __init__
方法是 运行 之前导入 jpy,因此在通过 [=13] 初始化 JVM 之前=] 方法调用。所以我编辑了 jasperpy.py 并将 import jpy 从第 14 行移动到第 56 行,直接在调用 jpyutil.init_jvm()
之后和调用 jpy.get_type('java.io.File')
之前,我能够成功 运行 Jasper 通过显示的示例代码从 python 报告。这是我的 jasperpy.py 现在的样子。
# -*- coding: utf-8 -*-
# GNU GENERAL PUBLIC LICENSE
#
# Copyright (c) 2020 Jadson Bonfim Ribeiro <contato@jadsonbr.com.br>
#
import os
import subprocess
import re
import xml.etree.ElementTree as ET
import tempfile
import jpyutil
#import jpy
import json
from requests import Request, Session
FORMATS = (
'pdf',
'rtf',
'xls',
'xlsx',
'docx',
'odt',
'ods',
'pptx',
'csv',
'html',
'xhtml',
'xml',
'jrprint',
)
EXECUTABLE = 'jasperstarter'
class JasperPy:
_FORMATS_JSON = ('pdf')
_FORMATS_METHODS_REQUEST = ('GET', 'POST', 'PUT')
def __init__(self, resource_dir=False, jvm_maxmem='512M', jvm_classpath=None):
self.WINDOWS = True if os.name == 'nt' else False
self.SCRIPT_DIR = os.path.abspath(os.path.dirname(__file__))
self.LIBS = os.path.join(self.SCRIPT_DIR, 'jasperstarter', 'lib')
if not os.path.isdir(self.LIBS):
raise NameError('Unable to find lib in {0}'.format(self.LIBS))
self.CLASSPATH = os.path.join(self.LIBS, 'jasperstarter.jar')
if not os.path.exists(self.CLASSPATH):
raise NameError('Unable to find jasperstarter in {0}'.format(self.LIBS))
if jvm_classpath is None:
jpyutil.init_jvm(jvm_maxmem=jvm_maxmem, jvm_classpath=[self.CLASSPATH])
else:
jpyutil.init_jvm(jvm_maxmem=jvm_maxmem, jvm_classpath=[self.CLASSPATH, jvm_classpath])
# IMPORT jpy HERE AFTER init_jvm
import jpy
self.jvFile = jpy.get_type('java.io.File')
self.jvArrays = jpy.get_type('java.util.Arrays')
self.jvReport = jpy.get_type('de.cenote.jasperstarter.Report')
self.jvConfig = jpy.get_type('de.cenote.jasperstarter.Config')
self.jvDsType = jpy.get_type('de.cenote.jasperstarter.types.DsType')
self.jvApplicationClasspath = jpy.get_type('de.cenote.tools.classpath.ApplicationClasspath')
self.jvHashMap = jpy.get_type('java.util.HashMap')
self.jvLocale = jpy.get_type('java.util.Locale')
self.jvJasperFillManager = jpy.get_type('net.sf.jasperreports.engine.JasperFillManager')
self.jvDb = jpy.get_type('de.cenote.jasperstarter.Db')
self.jvJsonQueryExecuterFactory = jpy.get_type('net.sf.jasperreports.engine.query.JsonQueryExecuterFactory')
self.jvJasperExportManager = jpy.get_type('net.sf.jasperreports.engine.JasperExportManager')
.
.
.
.
此文件位于 Lib\site-packages\pyreportjasper-2.0.2-py3.8.egg\pyreportjasper 下的 Python 目录中。虽然目前这是一个让它工作的 hack,但显然需要对包进行修复,我将尝试在 pyreportjasper github 页面上解决这个问题。