Python 如何解决此问题:pyreportjasper:ImportError:DLL在导入jpy时加载失败:找不到指定的模块

Python 如何解决此问题:pyreportjasper:ImportError:DLL在导入jpy时加载失败:找不到指定的模块,python,jasper-reports,Python,Jasper Reports,我想在python flask应用程序中使用Jasper Reports 我已按照本页上的安装说明进行操作: 导入jpy行失败,我得到错误: ImportError:导入jpy时DLL加载失败:找不到指定的模块 我使用的是32位python:3.8.6rc1。 32位JDK:JavaC1.8.0_261 当我运行pip install pyreportjasper时,它说:需求已经满足:c:\users中的jpy 有什么想法吗?看来您需要导入jpyutil,然后在调用import-jpy之前初

我想在python flask应用程序中使用Jasper Reports

我已按照本页上的安装说明进行操作:

导入jpy行失败,我得到错误:

ImportError:导入jpy时DLL加载失败:找不到指定的模块

我使用的是32位python:3.8.6rc1。 32位JDK:JavaC1.8.0_261

当我运行pip install pyreportjasper时,它说:需求已经满足:c:\users中的jpy


有什么想法吗?

看来您需要导入jpyutil,然后在调用import-jpy之前初始化JVM。下面的代码为我修复了这个错误。更进一步

import jpyutil
jpyutil.init_jvm(jvm_maxmem='512M')
import jpy
更新:因此,尽管上述语句是正确的,但它并没有直接解决在项目页面上运行示例代码的问题:

在深入研究代码时,我发现jasperpy.py正在尝试在运行
\uuu init\uuu
方法之前导入jpy,因此在通过
jpyutil.init\uJVM()方法调用初始化JVM之前导入jpy。因此,我编辑了jasperpy.py并将import jpy从第14行移动到第56行,在调用
jpyutil.init_jvm()
之后和调用
jpy.get_type('java.io.File')
之前,我能够通过所示的示例代码从python成功运行Jasper报告。这是我的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')
.
.
.
.
#-*-编码:utf-8-*-
#GNU通用公共许可证
#
#版权所有(c)2020 Jadson Bonfim Ribeiro
#
导入操作系统
导入子流程
进口稀土
将xml.etree.ElementTree作为ET导入
导入临时文件
导入jpyutil
#进口日元
导入json
从请求导入请求,会话
格式=(
“pdf”,
“rtf”,
“xls”,
“xlsx”,
“docx”,
“odt”,
“ods”,
"pptx",,
“csv”,
“html”,
“xhtml”,
“xml”,
“jrprint”,
)
可执行文件='Jasperster'
茉莉花类:
_格式_JSON=('pdf')
_格式\方法\请求=('GET','POST','PUT')
def uuu init uuuuu(self,resource_dir=False,jvm_maxmem='512M',jvm_classpath=None):
如果os.name='nt'else为False,则self.WINDOWS=True
self.SCRIPT_DIR=os.path.abspath(os.path.dirname(_文件__))
self.LIBS=os.path.join(self.SCRIPT_DIR,'jasperstarter','lib')
如果不是os.path.isdir(self.LIBS):
raise NameError('无法在{0}中找到lib'。格式(self.LIBS))
self.CLASSPATH=os.path.join(self.LIBS,'jasperstart.jar')
如果不存在os.path.exists(self.CLASSPATH):
raise NameError('在{0}中找不到jasperstarter'。格式(self.LIBS))
如果jvm_类路径为无:
jpyutil.init_jvm(jvm_maxmem=jvm_maxmem,jvm_classpath=[self.classpath])
其他:
jpyutil.init_jvm(jvm_maxmem=jvm_maxmem,jvm_classpath=[self.classpath,jvm_classpath])
#在init_jvm之后在此处导入jpy
进口日元
self.jvFile=jpy.get\u类型('java.io.File')
self.jvarray=jpy.get\u类型('java.util.Arrays'))
self.jvReport=jpy.get_type('de.cenote.jasperster.Report'))
self.jvConfig=jpy.get_type('de.cenote.jasperster.Config'))
self.jvDsType=jpy.get_type('de.cenote.jasperster.types.DsType'))
self.jvaapplicationclasspath=jpy.get\u type('de.cenote.tools.classpath.ApplicationClasspath'))
self.jvHashMap=jpy.get_类型('java.util.HashMap')
self.jvLocale=jpy.get\u类型('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'))
.
.
.
.

该文件位于Python目录下的Lib\site packages\pyreportjasper-2.0.2-py3.8.egg\pyreportjasper。虽然这是目前的一个黑客程序,但显然需要对包进行修复,我将在pyreportjasper github页面上尝试解决此问题。

非常感谢!我会测试你的答案,让你知道我的答案。到目前为止,我已经通过使用蟒蛇解决了这个问题。我安装了它,一切正常,不知道为什么。这是一个相当大的安装,所以如果可以的话,我想回到使用常规python。只是想让您知道,我修复了这个错误,并向pyreportjasper提交了一个Pull请求。它已被接受并合并到主分支中。如果您能接受这一正确答案,我将不胜感激。感谢令人惊叹的!!谢谢