【问题标题】:How do I run a Python Script in a Java web application?如何在 Java Web 应用程序中运行 Python 脚本?
【发布时间】:2015-08-17 04:43:48
【问题描述】:

我需要在我的 Java 应用程序中运行一个 Python 脚本(写入输入和读取输出),该脚本最终将上传到网络上。我该如何做到这一点,使其与网络兼容?我在Java中尝试过JythonRuntime.exec()之类的东西,我认为两者都需要在计算机上安装Python(如果我错了,请纠正我)但我希望该应用程序可以由任何人运行网络。

Python 脚本导入 win32com.client 以对 COM 对象进行操作。它读入一个 .csv 文件,运行外部软件,然后使用 RCSV(...)、Run(...) 和 WCSV(...) 方法写入一个 .csv 文件。我希望直接从我的 Java 应用程序访问这些数据,而不是 .csv 文件。这是我的完整python脚本供参考:

import win32com.client
from win32com.client import VARIANT
import csv

# This will import VT_VARIANT
import pythoncom

#dictionary function designed to read .csv file
def RCSV(address):
        input=[]
        csv_reader = csv.DictReader(open(address, 'r'), delimiter=',', quotechar='"')
        headers = csv_reader.fieldnames
        for line in csv_reader:
                for i in range(len(csv_reader.fieldnames)):
                        input.append(line[csv_reader.fieldnames[i]])
        InVal=[]
        for i in range(int(len(input)/len(headers))):
                InVal.append([])
        for i in range(len(InVal)):
                for j in range(i*len(headers), (i+1)*len(headers)):
                        InVal[i].append(input[j])
        return InVal

#dictionary function which writes a .csv file given its address
def WCSV(address, output, headers):
    with open(address, 'w') as csvfile:
        writer = csv.DictWriter(csvfile, fieldnames=headers, lineterminator = '\n')
        writer.writeheader()

        for i in range(len(output[0])):
            writer.writerow({headers[x]: output[x][i] for x in range(len(headers))})

def Run(InType,InDesc,InVal,OutType,OutDesc):
    FieldArray = VARIANT(pythoncom.VT_VARIANT | pythoncom.VT_ARRAY, InDesc)
    AllValueArray=[None]*len(InVal)

    for i in range(len(InVal)):
        AllValueArray[i]=VARIANT(pythoncom.VT_VARIANT | pythoncom.VT_ARRAY, InVal[i])

    object.ChangeParametersMultipleElement(InType, FieldArray, AllValueArray)
    object.RunScriptCommand("SolvePowerFlow")
    OutVal = object.GetParametersMultipleElement(OutType, OutDesc,'')
    return OutVal

# This will establish the connection
object = win32com.client.Dispatch("pwrworld.SimulatorAuto") 
filename= r"C:\Users\janusz\Desktop\NTU microgrid topology\ICESO Scaledown microgrid.pwb"
object.OpenCase(filename)

# Reading inputs from a .csv
ADIN='IN.csv'
InVal = RCSV(ADIN)

InType = "GEN"
InDesc = ["BusNum", "GenID", "GenMW"]

OutType = "BUS"
OutDesc = ["BUSNUM", "BUSNAME", "BUSPUVOLT", "BUSANGLE", "BUSKVVOLT"]

OutVal = Run(InType,InDesc,InVal,OutType,OutDesc)
ADOUT='OUT.csv'
WCSV(ADOUT,OutVal[1],OutDesc)

#This will close the connection
del object
object = None

【问题讨论】:

  • 能否详细说明所有平台COM Object的关系?
  • 对不起,我想我的问题措辞有误。我的意思是如何在 Java 中实现包含 COM 对象的 Python 脚本,以便任何用户都可以在 Web 上查看 Java 应用程序?

标签: java python web web-applications com


【解决方案1】:

Jython 无需在主机上安装 Python 即可工作,因为它是 Python 的 100% Java 实现。话虽如此,只有win32 客户端可以运行win32 COM 任何东西。所以,除了 win32(可能是 win64 到 wow)之外,它永远不会在任何平台上兼容。

【讨论】:

  • 好吧,假设我只希望它在 Windows 上可见。我将如何在 Java 中实现这个 COM 对象? Jython 不允许我这样做,因为它不包括 win32。我尝试过 Java-COM Bridge (JACOB),但我不知道如何用 java 重写我的 python 脚本,因为它们的文档非常简短。这是我的 python 代码的 sn-p,其中 \n 是一个新行:object = win32com.client.Dispatch("pwrworld.SimulatorAuto") \n filename = r"ICESO Scaledown microgrid.pwb" \n object.OpenCase(filename)
  • 在私有端口上的 Windows 上部署基于 python 的解决方案可能要容易得多,然后您可以查询该服务器并将结果传回(使您的 Java 应用程序成为中间层)。在 Java 中使用 COM 不适合胆小的人。
  • 抱歉,我不明白您将 Java 设为中间层是什么意思。这是否意味着我在 Python 上运行我的 Web 应用程序并将 Java 嵌入到应用程序中?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2023-01-30
  • 1970-01-01
  • 2012-10-06
  • 2017-05-03
  • 2012-02-21
  • 1970-01-01
  • 2020-10-26
相关资源
最近更新 更多