LaunchAgents runs Python script in version 2

launchdpathpython

Maybe someone can explain this. I'm having LaunchAgents run a Python script on startup. The relevant part of the plist looks like:

<key>ProgramArguments</key>
<array>
    <string>python</string>
    <string>/Volumes/path to script

This launches the script in python2, despite the fact that "python" points to python3:

/usr/local/bin/python -> /Library/Frameworks/Python.framework/Versions/3.8/bin/python3.8

…which errors because launchd is running a python3 script in python2. To fix it I had to specify python3:

<key>ProgramArguments</key>
<array>
    <string>python3</string>
    <string>/Volumes/

Am I doing this right? Is python2 coded into launchd somewhere? Is there a reason I still need to specify python3?

Best Answer

As mentioned in the comments, you can use full paths in the XML, e.g.:

<string>/usr/local/bin/python</string>

launchd isn't aware of environmental variables, like $PATH, unless explicitly set in the XML, so python would default to /usr/bin/python.

https://serverfault.com/questions/111391/use-an-environment-variable-in-a-launchd-script