如何从IBM的Python for PASE调用RPG程序?
我尝试过os.system,subprocess.popen / call但是它们没有用。
更新
我在IBM的网站上找到了一些东西。我试过以下;它没有给我任何错误,但RPG程序没有执行(意味着它没有给出预期的结果)。
from itoolkit import *
from itoolkit.lib.ilibcall import *
itool = iToolKit()
itransport = iLibCall()
itool.add(iCmd('CALL', 'CALL TEMPLIB/TEMPPGM'))
itool.call(itransport)
答案 0 :(得分:0)
我不是Python的专家,但请查看Young i Professional网站上的iPgm。
答案 1 :(得分:0)
此答案假设您使用的是iSeriesPython。如果您使用的是IBM的一个Python发行版,它不适用。
首先,os.system
应该有效。它只是将命令传递给命令行,因此您可以执行
import os
os.system('CALL TEMPLIB/TEMPPGM')
它应该有效。
但是,就像你在命令行上调用的任何程序一样,你不能以这种方式接收参数。如果需要获取输出参数的值,请使用os400.Program
来调用任何* PGM对象。
documentation不是最全面或最新的,但它会告诉您需要了解的内容。在这种情况下,由于您的示例没有参数,我不包括我的参数:
import os400
pgm = os400.Program('TEMPPGM', 'TEMPLIB', ())
pgm()
通常你会想要参数。以下是文档中的示例:
getprice = os400.Program('GETPRICE', '*LIBL', (('c', 10), ('d', 9, 0)))
getprice('PART_A', 0)
price = getprice[1]
答案 2 :(得分:0)
基于XMLSERVICE的Python itoolkit的文档是here,特别是你想要iPgm。
没有参数的简单示例是:
from itoolkit import *
from itoolkit.lib.ilibcall import *
itransport = iLibCall()
itool = iToolKit()
itool.add(iPgm('pgmcall','TEMPPGM', {'lib': 'TEMPLIB'}))
itool.call(itransport)
output = itool.dict_out('pgmcall')
if 'success' in output:
print('Success!')
指定库的另一个解决方案是首先添加iCmd
操作,将TEMPLIB
添加到库列表中。您可以在此处找到更多示例:http://python-itoolkit.readthedocs.io/en/latest/examples.html
答案 3 :(得分:0)
库XMLSERVICE在RPG中有一组可调用的演示程序和一些示例代码。我刚刚在PowerUP18会议上做了关于XMLSERVICE的会议并使用了这个例子,它在7.2和OPS许可程序中都有效。
from itoolkit.lib.ilibcall import *
itransport = iLibCall()
from itoolkit import *
# XMLSERVICE/ZZCALL:
# D INCHARA S 1a
# D INCHARB S 1a
# D INDEC1 S 7p 4
# D INDEC2 S 12p 2
# D INDS1 DS
# D DSCHARA 1a
# D DSCHARB 1a
# D DSDEC1 7p 4
# D DSDEC2 12p 2
# *+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
# * main(): Control flow
# *+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
# C *Entry PLIST
# C PARM INCHARA
# C PARM INCHARB
# C PARM INDEC1
# C PARM INDEC2
# C PARM INDS1
itool = iToolKit()
itool.add(iCmd('chglibl', 'CHGLIBL LIBL(XMLSERVICE)'))
itool.add(
iPgm('zzcall','ZZCALL')
.addParm(iData('INCHARA','1a','a'))
.addParm(iData('INCHARB','1a','b'))
.addParm(iData('INDEC1','7p4','32.1234'))
.addParm(iData('INDEC2','12p2','33.33'))
.addParm(
iDS('INDS1')
.addData(iData('DSCHARA','1a','a'))
.addData(iData('DSCHARB','1a','b'))
.addData(iData('DSDEC1','7p4','32.1234'))
.addData(iData('DSDEC2','12p2','33.33'))
)
)
# xmlservice
itool.call(itransport)
# output
chglibl = itool.dict_out('chglibl')
if 'success' in chglibl:
print (chglibl['success'])
else:
print (chglibl['error'])
exit()
zzcall = itool.dict_out('zzcall')
if 'success' in zzcall:
print (zzcall['success'])
print (" INCHARA : " + zzcall['INCHARA'])
print (" INCHARB : " + zzcall['INCHARB'])
print (" INDEC1 : " + zzcall['INDEC1'])
print (" INDEC2 : " + zzcall['INDEC2'])
print (" INDS1.DSCHARA: " + zzcall['INDS1']['DSCHARA'])
print (" INDS1.DSCHARB: " + zzcall['INDS1']['DSCHARB'])
print (" INDS1.DSDEC1 : " + zzcall['INDS1']['DSDEC1'])
print (" INDS1.DSDEC2 : " + zzcall['INDS1']['DSDEC2'])
else:
print (zzcall['error'])
exit()
获取库列表和语法正确可能是最难的部分