如何从Python调用RPG程序

时间:2018-05-29 04:31:04

标签: python subprocess ibm-midrange

如何从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)    

4 个答案:

答案 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()

获取库列表和语法正确可能是最难的部分