Post Reply 
Sharing Variables between Python and HPppl
05-19-2022, 03:43 PM
Post: #8
RE: Sharing Variables between Python and HPppl
(05-17-2022 01:33 PM)matalog Wrote:  How can I share a string variable between a Python program and a HPppl program?

Can I run a PPL program, from a Python program with pplname(var), if I had a ppl program called pplname, and had generated a variable var in the Python program?

No, you can't because PYTHON and HOME don't know anything of each other but ...

I do not pretend to really KNOW how these things are working. But from tinkering around I've got some findings that should help. Let me elaborate a bit on this.

About hpprime.eval():
it is important to understand that this function only passes on a string to the HOME environment which must be syntactically correct. Therefore you need to ensure the string is understood.
A statement like pplname(var) can't do anything because neither pplname nor var have any meaning except perhaps in their environment where they were created.

There are methods however to communicate between PYTHON and HOME environments, of which I'll explain the path from PYTHON to HOME

consider these two code snippets, first a PPL program
Code:
EXPORT test(arg1)
BEGIN
arg1:=arg1+" adding some text in PPL";
RETURN arg1;
END;
This program receives the variable <arg1> does something with it and returns what's now in arg1. Simply start it from the HOME screen with <test("abc") and see the result. Well you know that of course, but let's go step by step.

Let's now create a PYTHON program to see how to interface using hpprime.eval()
Code:
from hpprime import *
arg1="arg1: text"
ttt=eval('test('+'"'+arg1+'"'+')')
print(ttt)


Now a close look to the statement:
ttt=eval('test('+'"'+arg1+'"'+')')
ttt is the variable that receives what is returned from <test(arg1)>
eval calls this function with a rather complicated argument.
As explained earlier you have to provide a string that's understood by HOME. This is achieved by enclosing it in single quotes. But as you can see there's a lot of almost not discernible quoting. Step by step.
Code:
eval('test('     is starting the string
+ '"'              actually is ' " ' concatenating the double quotes to the string without the blanks
+ arg1          is concatenating the string that is in arg1, which is "arg1: text"
+ '"'             actually is ' " ' concatenating the double quote to the string without the blanks
')'              Concatenates the closing parentheses to the argument handed over to test () while the last parentheses simply closes the evaluate.

Sounds complicated, no? The double quotes enclosed in single quotes ensure that the content of arg1 is passed on to the home environment as a string, rather than as a variable name which doesn't exist and would raise an error

Conclusion: for using hpprime.eval() you have to create a string that's understood by the home environment. It is important to use single and double quotes as demonstrated in this example because HOME environment has a different interpretation of single quotes. Elsewhere I have already shown that a function:
Code:
def string(arg):
  return '"'+str(arg)+'"'

ttt=eval('test('+'"'+arg1+'"'+')')
would change to:
ttt=eval('test('+string(arg1) +')')
makes it less complicated.

If you got it wrong then ttt will respond with "Error: Syntax Error"

Now I'll have a break, but later I'll talk about using AVars which is another way to have PYTHON and HOME exchange contents. Stay tuned

HTH Günter
Find all posts by this user
Quote this message in a reply
Post Reply 


Messages In This Thread
RE: Sharing Variables between Python and HPppl - Guenter Schink - 05-19-2022 03:43 PM



User(s) browsing this thread: 1 Guest(s)