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 页面上解决这个问题。