I found the best approach was with pythonbind:

import intersys.pythonbind3 as pyb

url = "localhost"
userName= "???"
password="???"
port=1972

def main():
        conn     = pyb.connection()
        version = conn.get_implementation_version()
        conn.connect_now(f'[{url}][{port}]:%SYS', userName, password,None)

        # Create objects used to access cache/iris
        db  = pyb.database(conn)
        qry    = pyb.query (db)
        obj    = pyb.object(db)

......

With the connection handle and the db, qry, obj objects you can use the methods and classes to access any database item in the cache database

Ok, trying to isolate my syntax error. I have re-reviewed the class specs but I am not seeing an issue. I have this:

    allocated = 0
    used      = 0
    db          = "/data/testdb/"
    global      = "STRELPERF"
    
    # Set args to pass by reference
    list = [db,global,allocated,used]

    # exec the class method to get the global size
    res = self.db.run_class_method("%Library.GlobalEdit", "GetGlobalSize",list)

This is the call that returns the failure status of res(0,). The associated error text is :

ERROR #00: (no error description)

Since for other databases that do not contain the global I get the error:

ERROR #308: Global STRELPERF not found.

It seems that code clip is close but something that I am not seeing is missing. Any help would be appreciated.

That is my point of confusion. The 'IsError' method returns a value of 1 which indicates an error. But the run_class_method() is returning valid allocated and used global sizes for the specified global. I am unclear how I am getting valid results and an error. These would seem to be mutually exclusive.

A more optimal processing loop:

where hdl.run_obj_method("%Next",[status]):

     <process results>

I was able to resolve this issue by use the %Library.ResultSet' object '%New() method (python)

hdl = self.db.run_class_method('%Library.ResultSet',"%Library.ResultSet',%New",[])

The setting the class name and query to be executed:

        hdl.set("ClassName","%SYSTEM.License")
        hdl.set("QueryName","Summary")

This is then executed:

hdl.run_obj_method("%Execute",[])

The results are process in a while loop while the value of:

status = None

conStat=True


while conStat:
                lStat = hdl.run_obj_method("%Next",[status])

               if lStat:

                       < process results>

              conStat = lStat

There may be more elegent refinements to this python solution but this does accurate extract and return the license usage summary data

In talking to Intersystems in regards to this issue, the query that I would need to use is not defined as a proc. Unknown if that will be corrected in the future or not.

The prescribed solution was stated as:

"...So the solution requires writing your own method in ObjectScript that uses %ResultSet to run the query. Your method then loops through the results, and creates something that can be returned. You call your method from Python" [ joel.solon@intersystems.com ]

So I am closing this issue out. I may pursue that approach at a later date.

I resolved this issue. The intersys.pythonbind3 import on Windows references the dir "C:\Users\<user name>\AppData\Local\Programs\Python\Python37\Lib\site-packages\pythonbind3-1.0-py3.7-win-amd64.egg\intersys". I found that I can copy the contents of that dir to another windows server which allows the process to execute on a remote server even if cache is not installed on that remote server

This is a summary of the report that I am trying to create through a Python process:

For the values in the "local" column I am using the %SYSTEM.License class and setting the values as follows:

  Current License Units Used -     ->  LUConsumed

   Maximum License Units Used  --> LUMaxConsumed

   License Units Enforced               --> KeyEnforcedUnits

   License Units Authorized            --> KeyLicenseUnits

   Current Connections                   --> InstanceConnections

   Maximum Connections              --> InstanceConnectionsMax

The values appear to be match the Management Portal values. The instanceConnections and InstanceConnectionsMax in Python are Null so that is an open issue

For the values in the "distributed" column  are not completely clear. The first two values appear to be from the "%Monitor.SystemLicense" But this is my best guess. So for the distributed column I have:

      hdl = database.run_class_method("%Monitor.System.License","%New",[])

    Current License Units Used -     -->  hdl.get('CurrentUsedDist')

   Maximum License Units Used  -->hdl.get('MaxUsedDist')

   License Units Enforced               --> ?

   License Units Authorized            --> ?

   Current Connections                   --> ?

   Maximum Connections              --> ?

At this point I would like know how to get the missing distributed license values. Also, is the "%Monitor.System.License" the correct source for some of the distributed values?