Jump to content

pyscripter

Members
  • Content Count

    785
  • Joined

  • Last visited

  • Days Won

    42

Posts posted by pyscripter


  1. function  TPyPoint.SetAttr(key : PAnsiChar; value : PPyObject) : Integer

    is called whenever a property is set (e.g. spam.myPoint.x = 10).     So you can take an action when the object is modified.  

     

    However you are not notified when  spam.myPoint is assigned a value.

     

    To do what you would have to override the __setattr__ on the module, but this is too complicated.


  2. I wrote the code without testing, just to give you the idea.  Good that you solved the problem.

    Also instead of MainModule.builtins._input_prompt  you can use BuiltinModule._input_prompt.

     

    And the following would do.  No need to convert to AnsiString and back.

    procedure TForm1.PythonInputOutput1ReceiveUniData(Sender: TObject;
      var Data: string);
    begin
      InputQuery( 'Query from Python', BuiltinModule._input_prompt, Data);
    end;

     

    • Thanks 1

  3. Run a script like this:

     

    import builtins
    
    def myinput(prompt):
        builtins._input_prompt = prompt
        builtins._input(prompt)
    
    builtins._input = builtins.input
    builtins.input = myinput

    Then the prompt will be stored in builtins._input_prompt


  4. The KeyboardInterrupt is the correct way to terminate a thread from the main thread.

     

    47 minutes ago, iqrf said:

    <function DebugOutput.write at 0x02C56758> returned a result with an exception set'

    This is because print statement executes without clearing the KeyboardInterrupt exception.  You need to trap the KeyboardInterrupt exception either in Python or Delphi code.

     

    You can also add to your PythonInputOutput1SendUniData

    with GetPythonEngine do
      if PyErr_Occurred <> nil then begin
        PyErr_Clear;
        Exit;
      end;

     


  5. 2 hours ago, iqrf said:

    when exiting the thread

    How are you exiting the thread?  Are you raising a KeyboardInterrupt as in demo 33?   Then why are you surprised that an exception is raised, when the print statement executes.  You can modify your script as follows (not tested):

     

    while True:
        try:
            time.sleep(0.1)
            print(datetime.now())
        except KeyboardInterrupt:
            break

    or handle the exception in your Delphi code


  6. 13 hours ago, iqrf said:

    Do I have to worry about releasing the created PyBytes in TPyPoint.DoReceive using Py_XDECREF(pyBytes)

    No.  You should try to understand the rules behind reference counting. (e.g. Reference Counting in Python (tripod.com))

     

    Quote

    Most functions INCREF any object that should continue to exist after the function exits. This includes objects returned via arguments or a return statement. In these cases the calling function usually has responsibility for calling Py_DECREF(). The calling function can, in turn, pass responsibility for the DECREF to its caller.

    Note that PyBytes_FromStringAndSize returns a new reference, so there is no need to increment the count.

     

    Adjust(Self) is needed when you need to access the Delphi object properties or methods.


  7. On the Delphi side you can use PyArg_ParseTuple to get the pointer to the python object.  Then you can either:

     

    • use the python API to call the desired method on the python object or
    • wrap the python object into a custom variant (VarPythonCreate in the VarPyth unit) and call the method in a high-level way.  See tutorials and demos on VarPyth for details
    • Thanks 1

  8. The IPC unit based on named pipes created  by Russell Libby in 2003 and updated by @FPiette is worth checking.

    Blog article: Behind the connection: Inter Process Communication Using Pipes (francois-piette.blogspot.com)

    Source code: OverByte - Blog Source Code

     

    Named pipes in overlapped mode are super efficient and faster than sockets.  See Synchronous and Overlapped Pipe I/O - Win32 apps | Microsoft Learn.  See also I/O Completion Ports - Win32 apps | Microsoft Learn.  I have contributed such a solution to the python library RPyC and it beats the socket based IPC by a large margin.   The downside is that it is Windows only.


  9. On 1/14/2023 at 8:12 PM, uefi said:

    Hello, I can not get the result of the script execution instead of the result I get: 

    value=none

    What did you expect to get?

    Demo03 shows you how to use TPythonDelphiVar.


  10. Call you delphi module say "delphimodule"  and in your script:

     

    import delphimodule

    print(delphimodule.QUANTITY);

     

    or 

    from delphimodule import QUANTITY

    print(QUANTITY)

     

    Please look at the demos, before asking questions here and do yourself a favour.  Do watch the two video tutorials. It is only two hours viewing and will save you masses of time if you plan to do any serious work with P4D.

×