diff --git a/README.md b/README.md
index edca16ce..9d0e857d 100644
--- a/README.md
+++ b/README.md
@@ -57,6 +57,7 @@ Contents
- [Installation](#installation)
- [With pip](#with-pip)
- [From source](#from-source)
+ - [Python 2 support on macOS 12.3+](#python-2-support-on-macos-123)
- [Usage](#usage)
- [Workflow script skeleton](#workflow-script-skeleton)
- [Examples](#examples)
@@ -96,7 +97,6 @@ You can install any other library available on the [Cheese Shop][cheeseshop] the
It is highly advisable to bundle all your workflow's dependencies with your workflow in this way. That way, it will "just work".
-
### From source ###
@@ -122,6 +122,21 @@ Your workflow should look something like this:
Alternatively, you can clone/download the Alfred-Workflow [repository][repo] and copy the `workflow` subdirectory to your workflow's root directory.
+
+### Python 2 support on macOS 12.3+ ###
+
+Python 2 was [removed in macOS 12.3](https://developer.apple.com/documentation/macos-release-notes/macos-12_3-release-notes#:~:text=Python%202.7%20was%20removed%20from%20macOS%20in%20this%20update). Users that run macOS 12.3 or newer will have to [install Python 2.7.18 manually](https://www.python.org/downloads/release/python-2718/).
+Additionally, the following code needs to be added to the `info.plist` file after ``:
+
+```xml
+variables
+
+ PATH
+ /Library/Frameworks/Python.framework/Versions/2.7/bin:/usr/bin:/usr/local/bin:/bin:/usr/sbin:/sbin:/opt/homebrew/bin
+
+```
+
+This is required because Alfred doesn't inherit environment variables and doesn't source shell configuration files (such as `.zshrc`). By default, the `PATH` variable is [set to `/usr/bin:/bin:/usr/sbin:/sbin`](https://www.alfredapp.com/help/workflows/advanced/understanding-scripting-environment/) by Alfred.
Usage
@@ -136,7 +151,7 @@ A few examples of how to use Alfred-Workflow.
Set up your workflow scripts as follows (if you wish to use the built-in error handling or `sys.path` modification):
```python
-#!/usr/bin/python
+#!/usr/bin/env python
# encoding: utf-8
import sys
diff --git a/README_PYPI.rst b/README_PYPI.rst
index 4d1ef993..e647dc99 100644
--- a/README_PYPI.rst
+++ b/README_PYPI.rst
@@ -46,7 +46,7 @@ Here's how to show recent `Pinboard.in `_ posts
in Alfred.
Create a new workflow in Alfred's preferences. Add a **Script Filter** with
-Language ``/usr/bin/python`` and paste the following into the **Script**
+Language ``/usr/bin/env python`` and paste the following into the **Script**
field (changing ``API_KEY``):
diff --git a/bin/publish-cheeseshop.sh b/bin/publish-cheeseshop.sh
index f1dea3a2..ecd5fcde 100755
--- a/bin/publish-cheeseshop.sh
+++ b/bin/publish-cheeseshop.sh
@@ -7,7 +7,7 @@ rootdir=$(cd $(dirname $0)/../; pwd)
cd "${rootdir}"
version=$( cat workflow/version )
-/usr/bin/python setup.py sdist
+/usr/bin/env python setup.py sdist
twine upload dist/Alfred-Workflow-$version.tar.gz
cd -
diff --git a/docs/guide/background.rst b/docs/guide/background.rst
index 46441c31..a1013687 100644
--- a/docs/guide/background.rst
+++ b/docs/guide/background.rst
@@ -39,7 +39,8 @@ background). What we're doing is:
# Is cache over 1 hour old or non-existent?
if not wf.cached_data_fresh('exchange-rates', 3600):
run_in_background('update',
- ['/usr/bin/python',
+ ['/usr/bin/env',
+ 'python',
wf.workflowfile('update_exchange_rates.py')])
if is_running('update'):
diff --git a/docs/guide/setup.rst b/docs/guide/setup.rst
index d46df8bc..5b0313da 100644
--- a/docs/guide/setup.rst
+++ b/docs/guide/setup.rst
@@ -20,7 +20,7 @@ following (and only the following) **Escaping** options:
The **Script** field should contain the following::
- /usr/bin/python yourscript.py "{query}"
+ /usr/bin/env python yourscript.py "{query}"
where ``yourscript.py`` is the name of your script [#]_.
@@ -31,7 +31,7 @@ to capture any errors thrown by your scripts:
.. code-block:: python
:linenos:
- #!/usr/bin/python
+ #!/usr/bin/env python
# encoding: utf-8
import sys
@@ -67,7 +67,20 @@ to capture any errors thrown by your scripts:
log = wf.logger
sys.exit(wf.run(main))
+**Important note**: Python 2 was `removed in macOS 12.3 `_. Users that run macOS 12.3 or newer will have to `install Python 2.7.18 manually `_.
+Additionally, the following code needs to be added to the ``info.plist`` file after ````:
-.. [#] It's better to specify ``/usr/bin/python`` over just ``python``. This
- ensures that the script will always be run with the system default
- Python regardless of what ``PATH`` might be.
\ No newline at end of file
+.. code-block:: xml
+ :linenos:
+
+ variables
+
+ PATH
+ /usr/local/bin:/usr/bin:/Library/Frameworks/Python.framework/Versions/2.7/bin
+
+
+This is required because Alfred doesn't inherit environment variables and doesn't source shell configuration files (such as `.zshrc`).
+
+
+.. [#] It's better to specify ``/usr/bin/env python`` over just ``python``. This
+ ensures that the script will always be found.
\ No newline at end of file
diff --git a/docs/guide/text-encoding.rst b/docs/guide/text-encoding.rst
index 57616343..5abc5817 100644
--- a/docs/guide/text-encoding.rst
+++ b/docs/guide/text-encoding.rst
@@ -66,7 +66,7 @@ Use :meth:`Workflow.decode` to decode input and
.. code-block:: python
:linenos:
- #!/usr/bin/python
+ #!/usr/bin/env python
# encoding: utf-8
# Because we want to work with Unicode, it's simpler if we make
diff --git a/docs/guide/variables.rst b/docs/guide/variables.rst
index b4378d1e..13880f9c 100644
--- a/docs/guide/variables.rst
+++ b/docs/guide/variables.rst
@@ -190,7 +190,7 @@ read:
.. code-block:: bash
- /usr/bin/python myscript.py pages
+ /usr/bin/env python myscript.py pages
The other options (``--view``, ``--edit``, ``--share``) are set via the
diff --git a/docs/index.rst b/docs/index.rst
index f2b064d2..a956baae 100644
--- a/docs/index.rst
+++ b/docs/index.rst
@@ -58,7 +58,7 @@ Quick example
Here's how to show recent `Pinboard.in `_ posts in Alfred.
Create a new workflow in Alfred's preferences. Add a **Script Filter** with
-Language ``/usr/bin/python`` and paste the following into the **Script**
+Language ``/usr/bin/env python`` and paste the following into the **Script**
box (changing ``API_KEY``):
.. code-block:: python
diff --git a/docs/supported-versions.rst b/docs/supported-versions.rst
index efcced9d..885149e9 100644
--- a/docs/supported-versions.rst
+++ b/docs/supported-versions.rst
@@ -51,7 +51,7 @@ Alfred-Workflow supports the same macOS versions as Alfred, namely 10.6 (Snow Le
Python versions
===============
-Alfred-Workflow only officially supports the system Pythons that come with macOS (i.e. ``/usr/bin/python``), which is 2.6 on 10.6/Snow Leopard and 2.7 on later versions.
+Alfred-Workflow only officially supports the system Pythons that come with macOS (i.e. ``/usr/bin/env python``), which is 2.6 on 10.6/Snow Leopard and 2.7 on later versions.
.. important::
@@ -79,7 +79,7 @@ Here is the `full list of new features in Python 2.7`_, but the most important t
- No set literals.
- No dictionary or set comprehensions.
-Python 2.6 is still included in later versions of macOS (up to and including El Capitan), so run your Python scripts with ``/usr/bin/python2.6`` in addition to ``/usr/bin/python`` (2.7) to make sure they will run on Snow Leopard.
+Python 2.6 is still included in later versions of macOS (up to and including El Capitan), so run your Python scripts with ``/usr/bin/env python2.6`` in addition to ``/usr/bin/env python`` (2.7) to make sure they will run on Snow Leopard.
Why no Python 3 support?
diff --git a/docs/tutorial_1.rst b/docs/tutorial_1.rst
index a0643a09..fbf34329 100644
--- a/docs/tutorial_1.rst
+++ b/docs/tutorial_1.rst
@@ -79,7 +79,7 @@ argument.
.. note::
- You *can* choose ``/usr/bin/python`` as the **Language** and paste
+ You *can* choose ``/usr/bin/env python`` as the **Language** and paste
your Python code into the **Script** box, but this isn't the best idea.
If you do this, you can't run the script from the Terminal (which can be
diff --git a/docs/tutorial_2.rst b/docs/tutorial_2.rst
index 0dc47521..d3f46604 100644
--- a/docs/tutorial_2.rst
+++ b/docs/tutorial_2.rst
@@ -892,7 +892,7 @@ update itself:
# Start update script if cached data are too old (or doesn't exist)
if not wf.cached_data_fresh('posts', max_age=600):
- cmd = ['/usr/bin/python', wf.workflowfile('update.py')]
+ cmd = ['/usr/bin/env', 'python', wf.workflowfile('update.py')]
run_in_background('update', cmd)
# Notify the user if the cache is being updated
diff --git a/extras/benchmark.py b/extras/benchmark.py
index 7f1c96f0..c9298fcc 100755
--- a/extras/benchmark.py
+++ b/extras/benchmark.py
@@ -1,4 +1,4 @@
-#!/usr/bin/python
+#!/usr/bin/env python
# encoding: utf-8
#
# Copyright (c) 2016 Dean Jackson
diff --git a/extras/benchmarks/00-python-interpreter-only/run.sh b/extras/benchmarks/00-python-interpreter-only/run.sh
index 0172a6f5..7e0d39a3 100755
--- a/extras/benchmarks/00-python-interpreter-only/run.sh
+++ b/extras/benchmarks/00-python-interpreter-only/run.sh
@@ -1,3 +1,3 @@
#!/bin/bash
-/usr/bin/python -c ''
+/usr/bin/env python -c ''
diff --git a/extras/benchmarks/01-read-info-plist/run.sh b/extras/benchmarks/01-read-info-plist/run.sh
index af73361e..1c31b3bd 100755
--- a/extras/benchmarks/01-read-info-plist/run.sh
+++ b/extras/benchmarks/01-read-info-plist/run.sh
@@ -1,3 +1,3 @@
#!/bin/bash
-/usr/bin/python ./script.py
+/usr/bin/env python ./script.py
diff --git a/extras/benchmarks/01-read-info-plist/script.py b/extras/benchmarks/01-read-info-plist/script.py
index fc563a87..b93d6e4a 100644
--- a/extras/benchmarks/01-read-info-plist/script.py
+++ b/extras/benchmarks/01-read-info-plist/script.py
@@ -1,4 +1,4 @@
-#!/usr/bin/python
+#!/usr/bin/env python
# encoding: utf-8
#
# Copyright (c) 2016 Dean Jackson
diff --git a/extras/benchmarks/02-large-info-plist/run.sh b/extras/benchmarks/02-large-info-plist/run.sh
index af73361e..1c31b3bd 100755
--- a/extras/benchmarks/02-large-info-plist/run.sh
+++ b/extras/benchmarks/02-large-info-plist/run.sh
@@ -1,3 +1,3 @@
#!/bin/bash
-/usr/bin/python ./script.py
+/usr/bin/env python ./script.py
diff --git a/extras/benchmarks/02-large-info-plist/script.py b/extras/benchmarks/02-large-info-plist/script.py
index fc563a87..b93d6e4a 100644
--- a/extras/benchmarks/02-large-info-plist/script.py
+++ b/extras/benchmarks/02-large-info-plist/script.py
@@ -1,4 +1,4 @@
-#!/usr/bin/python
+#!/usr/bin/env python
# encoding: utf-8
#
# Copyright (c) 2016 Dean Jackson
diff --git a/extras/benchmarks/03-read-envvars/run.sh b/extras/benchmarks/03-read-envvars/run.sh
index 38eb63cf..11b46423 100755
--- a/extras/benchmarks/03-read-envvars/run.sh
+++ b/extras/benchmarks/03-read-envvars/run.sh
@@ -7,4 +7,4 @@ export alfred_workflow_data="$HOME/Library/Application Support/Alfred 2/Workflow
# export alfred_workflow_name="Alfred Workflow"
# export alfred_workflow_version="1.1.1"
-/usr/bin/python ./script.py
+/usr/bin/env python ./script.py
diff --git a/extras/benchmarks/03-read-envvars/script.py b/extras/benchmarks/03-read-envvars/script.py
index fc563a87..b93d6e4a 100644
--- a/extras/benchmarks/03-read-envvars/script.py
+++ b/extras/benchmarks/03-read-envvars/script.py
@@ -1,4 +1,4 @@
-#!/usr/bin/python
+#!/usr/bin/env python
# encoding: utf-8
#
# Copyright (c) 2016 Dean Jackson
diff --git a/tests/test_workflow.py b/tests/test_workflow.py
index 626fa667..3237416a 100644
--- a/tests/test_workflow.py
+++ b/tests/test_workflow.py
@@ -1,4 +1,4 @@
-#!/usr/bin/python
+#!/usr/bin/env python
# encoding: utf-8
#
# Copyright (c) 2014 Dean Jackson
diff --git a/tests/test_workflow_update.py b/tests/test_workflow_update.py
index 72485fe3..5c8c105b 100644
--- a/tests/test_workflow_update.py
+++ b/tests/test_workflow_update.py
@@ -91,15 +91,17 @@ def update(wf):
with fakeresponse(httpserver, RELEASES_JSON, HTTP_HEADERS_JSON):
with ctx() as (wf, c):
wf.run(update)
- assert c.cmd[0] == '/usr/bin/python'
- assert c.cmd[2] == '__workflow_update_check'
+ assert c.cmd[0] == '/usr/bin/env'
+ assert c.cmd[1] == 'python'
+ assert c.cmd[3] == '__workflow_update_check'
update_settings = UPDATE_SETTINGS.copy()
update_settings['prereleases'] = True
with ctx(update_settings=update_settings) as (wf, c):
wf.run(update)
- assert c.cmd[0] == '/usr/bin/python'
- assert c.cmd[2] == '__workflow_update_check'
+ assert c.cmd[0] == '/usr/bin/env'
+ assert c.cmd[1] == 'python'
+ assert c.cmd[3] == '__workflow_update_check'
def test_install_update(httpserver, alfred4):
@@ -116,8 +118,9 @@ def fake(wf):
print('Magic update command : {0!r}'.format(c.cmd))
- assert c.cmd[0] == '/usr/bin/python'
- assert c.cmd[2] == '__workflow_update_install'
+ assert c.cmd[0] == '/usr/bin/env'
+ assert c.cmd[1] == 'python'
+ assert c.cmd[3] == '__workflow_update_install'
update_settings = UPDATE_SETTINGS.copy()
del update_settings['version']
@@ -164,8 +167,9 @@ def fake(wf):
print('Magic update command : {!r}'.format(c.cmd))
- assert c.cmd[0] == '/usr/bin/python'
- assert c.cmd[2] == '__workflow_update_install'
+ assert c.cmd[0] == '/usr/bin/env'
+ assert c.cmd[1] == 'python'
+ assert c.cmd[3] == '__workflow_update_install'
with env(alfred_workflow_version='v10.0-beta'):
update_settings = UPDATE_SETTINGS.copy()
diff --git a/workflow/background.py b/workflow/background.py
index c2bd7352..978417ad 100644
--- a/workflow/background.py
+++ b/workflow/background.py
@@ -230,7 +230,7 @@ def run_in_background(name, args, **kwargs):
_log().debug('[%s] command cached: %s', name, argcache)
# Call this script
- cmd = ['/usr/bin/python', __file__, name]
+ cmd = ['/usr/bin/env', 'python', __file__, name]
_log().debug('[%s] passing job to background runner: %r', name, cmd)
retcode = subprocess.call(cmd)
diff --git a/workflow/workflow.py b/workflow/workflow.py
index 39352279..73132935 100644
--- a/workflow/workflow.py
+++ b/workflow/workflow.py
@@ -2330,7 +2330,7 @@ def check_update(self, force=False):
update_script = os.path.join(os.path.dirname(__file__),
b'update.py')
- cmd = ['/usr/bin/python', update_script, 'check', repo, version]
+ cmd = ['/usr/bin/env', 'python', update_script, 'check', repo, version]
if self.prereleases:
cmd.append('--prereleases')
@@ -2369,7 +2369,7 @@ def start_update(self):
update_script = os.path.join(os.path.dirname(__file__),
b'update.py')
- cmd = ['/usr/bin/python', update_script, 'install', repo, version]
+ cmd = ['/usr/bin/env', 'python', update_script, 'install', repo, version]
if self.prereleases:
cmd.append('--prereleases')