Adding pip to Pythonista for iOS
22 Jul 2022Pythonista is probably the most popular Python app for iOS.
This post is a summary of the work I did to get pip
working.
Here’s how to do it:
import requests
import sys
from io import BytesIO
from zipfile import ZipFile
# Get the location of the Python 3 site-packages
site_packages = next(filter(
lambda x: 'site-packages-3' in x,
sys.path
))
# extract directly into site-packages
ZipFile(BytesIO(requests.get(
'https://files.pythonhosted.org/packages/90/a9/1ea3a69a51dcc679724e3512fc2aa1668999eed59976f749134eb02229c8/pip-21.3-py3-none-any.whl'
).content)).extractall(site_packages)
print("Downloaded pip")
This downloads pip
to the site-packages
folder for Python 3.
Pythonista calls this folder site-packages-3
.
Now that we have pip
set up, we can start downloading our first package:
import pip
import sys
site_packages = next(filter(
lambda x: 'site-packages-3' in x,
sys.path
))
print(
pip.main(f'install ',
f'--target {site_packages} '
f'tqdm'.
split(' '))
)
This works a bit differently from how you would typically use pip
.
Since we use it as a library, we call the pip.main
function with a list of arguments (created by .split(' ')
).
The default directory pip
tries is not writable.
It’s part of the Pythonista app.
We therefore manually indicate it should write to our site-packages-3
folder using --target
.
Note that this probably will not yet work for dependencies with binary extensions (libraries like scipy etc.).
Of course, I also tried to use StaSh.
This seemed quite suitable at first, but upon closer inspection, the pip
it contained is not the common version.
In fact it contains its own pip.py
which approximates the canonical pip
’s behaviour.
In a next post I’ll explore how to use pip
to get binary wheels to install on your iDevice.
This will involve building wheels specific for iOS and maybe even setting up a PyPI mirror.