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
    15614
    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

      Hi —

      I’m trying to call Pythonista for the first time from a Shortcuts workflow. I understand that I should be able to call the Python code, passing values into argv somehow, but that there isn’t a direct way to return values unless you use a workaround (e.g. store the output value in the clipboard from Python, then retrieve the clipboard when the shortcut picks up again).

      I’m having trouble getting the Shortcut to actually find my Pythonista script. I’ve tried saving it both on iCloud and “on my iPad”.

      I’m triggering Pythonista by adding the “Run Script” step to my workflow, and then providing the name of the script. I’ve trying various syntaxes:

      • MyScript.py
      • MyScript
      • pythonista3://getPTEimg.py
      • pythonista3://iCloud/getPTEimg.py
      • pythonista3://iCloud/getPTEimg.py?action=run&root=iCloud
      • pythonista3://iCloud/getPTEimg.py?action=run

      The last one is the one that Pythonista seems to recommend, in that it is auto-generated when I select Wrench > Shortcuts... > Pythonista URL > Copy URL.

      In all cases, the call fails a "The file [filename] cannot be found" dialog box in Pythonista.

      Can someone confirm that I should, in fact, be using the "Run Script" command in Shortcuts for this, as well as the syntax to use and location the script needs to be at in order to be found?

      Thanks in advance!

      Ramon

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

        This works for me, the script is in This iPad/dir:

        tag

        The iCloud Path should be:
        /private/var/mobile/Library/Mobile Documents/iCloud~com~omz-software~Pythonista3/Documents

        but i dont use parameter

        Edit:
        Did a test for parameter with url scheme:
        see here: Pythonista Url scheme

        tag

        works too

        1 Reply Last reply Reply Quote 1
        • 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
                                            • First post
                                              Last post
                                            Powered by NodeBB Forums | Contributors