omz:forum

    • Register
    • Login
    • Search
    • Recent
    • Popular

    Welcome!

    This is the community forum for my apps Pythonista and Editorial.

    For individual support questions, you can also send an email. If you have a very short question or just want to say hello — I'm @olemoritz on Twitter.


    Correct way to call Pythonista script from within a Shortcuts workflow?

    Pythonista
    7
    38
    16004
    Loading More Posts
    • Oldest to Newest
    • Newest to Oldest
    • Most Votes
    Reply
    • Reply as topic
    Log in to reply
    This topic has been deleted. Only users with topic management privileges can see it.
    • felciano
      felciano last edited by

      Thanks @7upser -- very helpful. I've been able to reproduce your example with the Pythonista Url scheme and the script is now found and launched correctly. However it jumps into/drops me into Pythonista proper. Is there a way to avoid that (i.e. just run the whole script in the background)?

      cvp 1 Reply Last reply Reply Quote 0
      • cvp
        cvp @felciano last edited by

        @felciano said:

        just run the whole script in the background

        I don't think that Pythonista can run in the background.
        Apple only authorizes that for music or Bluetooth apps.

        1 Reply Last reply Reply Quote 0
        • 7upser
          7upser last edited by 7upser

          You can Start a Shortcut with Pythonista:

          import webbrowser
          vUrl = 'shortcuts://run-shortcut?name=testStartWithUrlScheme&input=10'
          webbrowser.get('safari').open(vUrl)
          

          Maybe you can split your Shortcut into 2 different Shortcuts.
          This should work, if you use Url Scheme on both sides.
          (it's not really in the Bachground, as cvp mentioned)

          1 Reply Last reply Reply Quote 0
          • mikeno
            mikeno last edited by mikeno

            Hi everybody, I could call a Pythonista script from shortcuts using url and safari but it works only if the iPad is awake, is there a way to let it work when the iPad is asleep?
            I also tried running a Pythonista script using scheduler but it works only if I stay in the Pythonista app.
            What I want to achieve is writing some info into a file every hour

            cvp 1 Reply Last reply Reply Quote 0
            • cvp
              cvp @mikeno last edited by

              @mikeno I don't know what you want to do while your IPad is asleep but Shortcuts offers automations. Perhaps that could help.

              1 Reply Last reply Reply Quote 0
              • mikeno
                mikeno last edited by mikeno

                Yes but only everyday, I want to read the value of the barometer sensor every hour, I can get this value with Pythonista. I didn’t find a way to get this information in shortcuts nor in JS (scriptable).
                I found also a way to do some tasks every hour in shortcuts but I don’t find a way to get the barometer sensor value.

                cvp 1 Reply Last reply Reply Quote 0
                • cvp
                  cvp @mikeno last edited by

                  @mikeno said

                  I found also a way to do some tasks every hour in shortcuts

                  But you could start a Pythonista script every hour?

                  1 Reply Last reply Reply Quote 0
                  • mikeno
                    mikeno last edited by

                    Yes, it works but only if the iPad is awake

                    cvp 1 Reply Last reply Reply Quote 0
                    • cvp
                      cvp @mikeno last edited by

                      @mikeno did you try to run an automation at specified time, which runs a Pythonista short script logging the pressure in a file and put your IPad asleep some time before the specified time?

                      1 Reply Last reply Reply Quote 0
                      • mikeno
                        mikeno last edited by

                        @cvp I’m not sure to understand what you mean, but calling a pythonista script from a shortcuts or an automation requires the iPad to be awake

                        cvp 1 Reply Last reply Reply Quote 0
                        • cvp
                          cvp @mikeno last edited by cvp

                          @mikeno ok, I thought that calling the script from the shortcut did launch Pythonista even if iPad not awake. If you have Pyto, you could test because it runs really in background like a music player

                          1 Reply Last reply Reply Quote 0
                          • mikeno
                            mikeno last edited by mikeno

                            I don’t know PyTo but I will try, thx in any case

                            cvp 1 Reply Last reply Reply Quote 0
                            • cvp
                              cvp @mikeno last edited by cvp

                              @mikeno not Py To but Pyto, I think there is a free test version

                              1 Reply Last reply Reply Quote 0
                              • mikeno
                                mikeno last edited by

                                I just downloaded it but my trial period already expired because I probably already tried it some times ago and since I don’t know if it works, I don’t want to buy it. If you’ve it, could you try if it runs when iPad is asleep?

                                cvp 2 Replies Last reply Reply Quote 0
                                • cvp
                                  cvp @mikeno last edited by

                                  @mikeno I'll do it and let it know

                                  1 Reply Last reply Reply Quote 0
                                  • cvp
                                    cvp @mikeno last edited by cvp

                                    @mikeno I have tried a script which prints the time each second and closed my iPad cover during 200 seconds and when I have reopened it, the script was still running

                                    1 Reply Last reply Reply Quote 0
                                    • mikeno
                                      mikeno last edited by

                                      Thx, the question is now if Pyto can read the barometer sensor value, below a short code which runs fine under Pythonista:

                                      from objc_util import ObjCInstance, ObjCClass, ObjCBlock, c_void_p
                                      
                                      pressure = None
                                      
                                      def get_pressure():
                                        
                                        def handler(_cmd, _data, _error):
                                          global pressure
                                          pressure = ObjCInstance(_data).pressure()
                                      
                                        handler_block = ObjCBlock(handler, restype=None, argtypes=[c_void_p, c_void_p, c_void_p])
                                      
                                        CMAltimeter = ObjCClass('CMAltimeter')
                                        NSOperationQueue = ObjCClass('NSOperationQueue')
                                        if not CMAltimeter.isRelativeAltitudeAvailable():
                                          print('This device has no barometer.')
                                          return
                                        altimeter = CMAltimeter.new()
                                        main_q = NSOperationQueue.mainQueue()
                                        altimeter.startRelativeAltitudeUpdatesToQueue_withHandler_(main_q, handler_block)
                                        try:
                                          while pressure is None:
                                            pass
                                        finally:
                                          altimeter.stopRelativeAltitudeUpdates()
                                          #print('Updates stopped.')
                                          return pressure.floatValue()*10
                                      
                                      pressure = get_pressure()
                                      print(pressure)
                                      
                                      cvp 2 Replies Last reply Reply Quote 0
                                      • cvp
                                        cvp @mikeno last edited by cvp

                                        @mikeno I know this code but I'm new in Pyto and surely not (yet?) a specialist in ObjectiveC of Pyto.
                                        I don't not yet know how to define an ObjcBlock in Pyto but I'll try.
                                        But, obviously, I'll need some time

                                        1 Reply Last reply Reply Quote 0
                                        • cvp
                                          cvp @mikeno last edited by cvp

                                          @mikeno Sorry, no idea how to define an ObjcBlock in rubicon (ObjectiveC in Pyto).
                                          Hoping that @JonB will read this and be able to help, as usual.

                                          # coding: utf-8
                                          from rubicon.objc import *
                                          from  ctypes import *
                                          
                                          def handler(_cmd, _data, _error):
                                              print(ObjCInstance(_data))
                                          
                                          handler_block = ObjCBlock(handler, None, [c_void_p, c_void_p, c_void_p])
                                          
                                          def main():
                                              CMAltimeter = ObjCClass('CMAltimeter')
                                              NSOperationQueue = ObjCClass('NSOperationQueue')
                                              if not CMAltimeter.isRelativeAltitudeAvailable():
                                                  print('This device has no barometer.')
                                                  return
                                              altimeter = CMAltimeter.new()
                                              main_q = NSOperationQueue.mainQueue
                                              altimeter.startRelativeAltitudeUpdatesToQueue_withHandler_(main_q, handler_block)
                                              print('Started altitude updates.')
                                              try:
                                                  while True:
                                                      pass
                                              finally:
                                                  altimeter.stopRelativeAltitudeUpdates()
                                                  print('Updates stopped.')
                                          
                                          if __name__ == '__main__':
                                              main()
                                          

                                          Gives

                                          Traceback (most recent call last):
                                            File "iCloud/barometer.py", line 8, in <module>
                                              handler_block = ObjCBlock(handler, None, [c_void_p, c_void_p, c_void_p])
                                            File "Pyto.app/Lib/rubicon/objc/api.py", line 1834, in __init__
                                              self.struct = cast(self.pointer, POINTER(ObjCBlockStruct))
                                            File "Pyto.app/site-packages/python3.10/ctypes/__init__.py", line 510, in cast
                                              return _cast(obj, obj, typ)
                                          ctypes.ArgumentError: argument 1: <class 'TypeError'>: wrong type
                                          
                                          JonB 1 Reply Last reply Reply Quote 0
                                          • mikeno
                                            mikeno last edited by

                                            Thx for trying, I’ll wait!

                                            cvp 1 Reply Last reply Reply Quote 0
                                            • First post
                                              Last post
                                            Powered by NodeBB Forums | Contributors