Как вызвать RPG программу из Python - PullRequest
0 голосов
/ 29 мая 2018

Как вы называете программу RPG из IBM Python для PASE?

Я пробовал 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 голосов
/ 31 мая 2018

Библиотека XMLSERVICE имеет набор демонстрационных программ на RPG, которые можно вызывать, и некоторый пример кода.Я только что провел сеанс по XMLSERVICE на конференции PowerUP18 и использовал этот пример, который работает в 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()

Получение правильного списка библиотек и синтаксиса, вероятно, самая сложная часть

0 голосов
/ 29 мая 2018

В этом ответе предполагается, что вы используете iSeriesPython . не применяется, если вы используете один из дистрибутивов Python от IBM.

Прежде всего, os.system должно работать.Он просто передает команду в командную строку, так что вы можете сделать

import os
os.system('CALL TEMPLIB/TEMPPGM')

И это должно работать.

Но, как и любая программа, которую вы вызываете из командной строки, вы не можете получить параметры таким способом.Если вам нужно получить значение выходных параметров, используйте os400.Program для вызова любого * объекта PGM.

Документация не самая полная или актуальная, ноон говорит вам, что вам нужно знать.В этом случае, поскольку в вашем примере нет параметров, я не включаю параметры в свой:

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]
0 голосов
/ 31 мая 2018

Документы для itoolkit Python на основе XMLSERVICE: здесь , в частности, вы хотите 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

0 голосов
/ 29 мая 2018

Я не специалист по Python, но посмотрите iPgm на сайте Young i Professional.

...