Including 3rd party libraries

It’s a Very Bad Idea ™ to install (or ask users to install) 3rd-party libraries in the OS X system Python. Alfred-Workflow makes it easy to include them in your Workflow.

Simply create a lib subdirectory under your Workflow’s root directory and install your dependencies there. You can call the directory whatever you want, but in the following explanation, I’ll assume you used lib.

To install libraries in your dependencies directory, use:

pip install --target=path/to/my/workflow/lib python-lib-name

The path you pass as the --target argument should be the path to the directory under your Workflow’s root directory in which you want to install your libraries. python-lib-name should be the “pip name” (i.e. the name the library has on PyPI) of the library you want to install, e.g. requests or feedparser.

This name is usually, but not always, the same as the name you use with import.

For example, to install Alfred-Workflow, you would run pip install Alfred-Workflow but use import workflow to import it.

An example: You’re in a shell in Terminal.app in the Workflow’s root directory and you’re using lib as the directory for your Python libraries. You want to install requests. You would run:

pip install --target=lib requests

This will install the requests library into the lib subdirectory of the current working directory.

Then you instantiate Workflow with the libraries argument:

1
2
3
4
5
6
7
8
from workflow import Workflow

def main(wf):
    import requests  # Imported from ./lib

if __name__ == '__main__':
    wf = Workflow(libraries=['./lib'])
    sys.exit(wf.run(main))

When using this feature you do not need to create an __init__.py file in the lib subdirectory. Workflow(…, libraries=['./lib']) and creating ./lib/__init__.py are effectively equal alternatives.

Instead of using Workflow(…, libraries=['./lib']), you can add an empty __init__.py file to your lib subdirectory and import the libraries installed therein using:

from lib import requests

instead of simply:

import requests