Including 3rd party libraries¶
It’s a Very Bad Idea™ to install (or ask users to install) 3rd-party libraries in the macOS system Python. Alfred-PyWorkflow makes it easy to include them in your Workflow.
Simply create a libs 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 libs.
To install libraries in your dependencies directory, use:
pip install --target=path/to/my/workflow/libs 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-PyWorkflow, you would run
pip install Alfred-PyWorkflow 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 libs as the directory for your Python libraries. You want to
install requests. You would run:
pip install --target=libs requests
This will install the requests library into the libs subdirectory of the
current working directory.
Then you instantiate Workflow
with the libraries argument:
1from workflow import Workflow
2
3def main(wf):
4 import requests # Imported from ./lib
5
6if __name__ == '__main__':
7 wf = Workflow(libraries=['./libs'])
8 sys.exit(wf.run(main))
When using this feature you do not need to create an __init__.py file in
the libs subdirectory. Workflow(…, libraries=['./libs']) and creating
./libs/__init__.py are effectively equal alternatives.
Instead of using Workflow(…, libraries=['./libs']), you can add an empty
__init__.py file to your libs subdirectory and import the libraries
installed therein using:
from libs import requests
instead of simply:
import requests
If you encounter a ModuleNotFoundError error, e.g. due to sub-dependencies not being aware of the ./libs path, you can add it like this:
sys.path.append("libs")
from lib import requests
