【发布时间】:2015-08-17 04:43:48
【问题描述】:
我需要在我的 Java 应用程序中运行一个 Python 脚本(写入输入和读取输出),该脚本最终将上传到网络上。我该如何做到这一点,使其与网络兼容?我在Java中尝试过Jython和Runtime.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