Skip to Content
Technical Articles

How To Use Python Seamlessly Inside ABAP

Python is an interpreted, object-oriented, high-level programming language and it is used in many different application areas, e.g. in scientific and numeric computing. It can be very valuable and helpful to combine SAP ABAP with Python. In this blog I will describe a way to do that via the SAP GUI for Windows COM interface.

In the past I wrote different blogs how to use Python in the context of ABAP:

Here now another way. The communication between Python and ABAP runs in this case via the COM interface. Python offers via Python for Win32 (pywin32) extensions the possibility to create COM server. With ABAP and the SAP GUI for Windows is it possible to connect these COM server and to use its functions.

  1. Download Python from here and install it.
  2. Download the Python for Windows (pywin32) Extensions from here and install it.
  3. Copy the following Python program to your computer.
    # -*- coding: iso-8859-15 -*-
    #-Begin-----------------------------------------------------------------
    
    class PythonDemo:
      #To create a new GUID use the commands:
      #>>> import pythoncom
      #>>> print(pythoncom.CreateGuid())
      _reg_clsid_ = "{D1B0A23F-0B6E-46D6-8880-744DBFFB86CD}"
      _reg_progid_ = "Python.Demo"
      _reg_desc_ = "Python Demo COM Server"
      _public_methods_ = ["HelloWorld", "HelloYou", "SplitString"]
    
      #-Function HelloWorld-------------------------------------------------
      def HelloWorld(self):
        import platform, struct
        return "Hello World from Python " + platform.python_version() + \
          " on " + platform.system() + " (" + platform.architecture()[0] + \
          ")"
    
      #-Function HelloYou---------------------------------------------------
      def HelloYou(self, name="Anybody"):
        return "Hello " + str(name) + " from Python"
    
      #-Function SplitString------------------------------------------------
      def SplitString(self, val, item=None):
        import string
        if item != None:
          item = str(item)
        return val.split(item)
    
    #-Sub Main--------------------------------------------------------------
    def main():
      import sys, win32com.server.register
      if sys.argv[1].lower() == "--register":
        print("Registering COM server...")
      if sys.argv[1].lower() == "--unregister":
        print("Unregistering COM server...")
      win32com.server.register.UseCommandLine(PythonDemo)
    
    #-Main------------------------------------------------------------------
    if __name__=="__main__":
      main()
    
    #-End-------------------------------------------------------------------​

    This Python program contains a class with three different demo methods:
    • HelloWorld returns a string with the using Python version, platform system and architecture.
    • HelloYou returns a string with a parameter.
    • SplitString – the standard example from the help – delivers a list of single words of a string.
    Also the class contains different annotations for the COM registration.
    The main routine of the program contains the registration code.

  4. Register this Python program as COM server.
  5. Try the following VBScript to check if everything is okay.
    '-Begin-----------------------------------------------------------------
    
      '-Sub Main------------------------------------------------------------
      Sub Main()
    
        Set PythonDemo = CreateObject("Python.Demo")
    
        MsgBox PythonDemo.HelloWorld()
    
        MsgBox PythonDemo.HelloYou("Stefan")
    
        response = PythonDemo.SplitString("Hello World")
        For Each item In response
          MsgBox item
        Next
    
      End Sub
    
      '-Main----------------------------------------------------------------
      Main
    
    '-End-------------------------------------------------------------------​

    This VBScript call from the COM server Python.Demo, in this case the Python program, the different methods – HelloWorld, HelloYou and SplitString.

    Here the result from HelloWorld:

    Here the result from HelloYou:

    Hint: It does not matter which version of VBScript you use – x86 or x64 – it works with both.

  6. Try the followin ABAP report.
    "-Begin-----------------------------------------------------------------
    REPORT ZPYTHON.
    
    DATA:
      lo_python TYPE OLE2_OBJECT,
      lv_return TYPE STRING,
      lo_list TYPE OLE2_OBJECT
      .
    
    CREATE OBJECT lo_python 'Python.Demo'.
    CHECK sy-subrc = 0 AND lo_python-Handle > 0 AND lo_python-Type = 'OLE2'.
    
    CALL METHOD OF lo_python 'HelloWorld' = lv_return.
    WRITE: / lv_return.
    
    CALL METHOD OF lo_python 'HelloYou' = lv_return
      EXPORTING
        #1 = 'Stefan'.
    WRITE: / lv_return.
    
    "Array is not supported as a data type for OLE parameters in ABAP
    CALL METHOD OF lo_python 'SplitString' = lo_list
      EXPORTING
        #1 = 'Hello World'.
    
    "-End-------------------------------------------------------------------​

    The ABAP report do exactly the same as the VBScript.

    Here the result of the ABAP report.

    Hint: It is not possible to use a COM method which delivers a variant from the type array. So it is not possible to use the method SplitString – SAP note 633105.

 

At this point we see that is easy possible to use Python inside ABAP seamlessly via COM interface. We register the Python class as COM server and use it inside ABAP.

A huge advantage is that you can change the Python class on the fly. This means you can add or change methods without a new registration. So you can develop and test your Python class independently from your ABAP code, but you can use each change immediately in your ABAP code.

Hint: It could be possible that the security settings of your SAP GUI for Windows doesn’t allow to create an object as in my case. If it is so and you want to experiment with this approach, disable this settings temporary for the time of your experiment. And don’t forget to enable it after your experiment.

<26=Automation(Error) : ERROR OCCURED IN MODULE: [Python Demo COM Server]
<26=Automation(Error) : PROGRAM_ID      |MODULE_NAME                |METHOD_NAME      |ERROR DESCRIPTION                  |VERSION                    |GUI VERSION       |MODULE_PATH              |
<26=Automation(Error) : Python.Demo     |Python Demo COM Server     |CREATEOBJECT     |Creation of control "" denied!     |Version info not found     |7500.1.3.1138     |Module doesnot exist     |
<26=Automation(Error) : "CreateObject"
                        #0: STRING "Python.Demo"
                        #1: LONG "1033"
                        could not create object

 

Addendum 2019/04/29

It tried this approach with Python 3.7.3 and Python for Windows 224 and it works only with x86. With Python 3.6.8, 3.7.2 and Python for Windows 224 all works well and as expected.

12 Comments
You must be Logged on to comment or reply to a post.
  • Hello Stefan,

    I have created COM Server using given python code and registered in SAP application server OS and restarted system and server.

    But on execution the given ABAP program, it’s giving SY-SUBRC = 3 error code.

    Is there anything I am missing in OS or SAP side.

    Best Regards,

    Praveer

     

    • Hello Praveer,

      sy-subrc 3 means problems with memory allocation at the presentation server. I don’t know what could be the reasons.

      Best regards
      Stefan

      • Hi Stefan,

        There was some mistake while registering COM server. Now I have successfully registered COM server.

        And it’s working fine in VBScript code.

        But getting SY-SUBRC = 2 error code on abap side and OLD HANDLE  is giving -1 value.

        Do we need to maintain Python.demo entry in SOLE t-code, if yes, please share the configuration information.

        Best Regards,

        Praveer

         

  • This one is awesome Stefan , I just saw , Did you ever get a chance to execute any ML Stuff using this way , if not then let’s do it together 🙂 what do you say.

     

    Before anything Thanks a lot for sharing this Valuable stuff.

     

     

    • Hello Shivam,

      thanks for your reply.

      No, I don’t used this interface for ML. I am an ML novice. I tried a little bit with AI face detection, but not more. Sure, let us do it something together.

      Best regards
      Stefan

    • Hi Shivam and Stefan,

      last week i implemented my first ML application where I implemented Pyhton code in the Jupyter notebook to use the PAL functions from the HANA server by using the pyhton hana_ml library.

       

      I am very interested to automate this process so that I can execute the pyhton code e.g. from AMDP on the server without the need of client connection.

      Do you have any documents or examples for that or do you have some hints how to do that?

       

      BR

      Robert