Hi @bernard778 ,
Actually it is possible and there is a lot of ways you can do that. You can use simple python code to download zip files from either github or Pypi for example and then extracting those files into your directories in Pythonista. Also, you can use the github API with the Jose package (that is one of the capacity that I use) to download github sources. And obviously there is Stash that you can use as there is pip with it. As for PyPi, here’s an example of code that I used in the past :

import urllib.request import tarfile import shutil import console import os import shutil import requests class Installer(object): def __init__(self, name, version, module_name=None): self.name = name self.version = version self.module_name = self.name.lower() if not module_name else module_name self.tarfolder = self.name + '-' + self.version self.tarname = self.tarfolder + '.tar.gz' self.tarURL = None self.keep_source = False self.keep_tarball = False def install(self, module_name=None, keep_source=False, keep_tarball=False): self.keep_source = keep_source self.keep_tarball = keep_tarball if module_name: self.module_name = module_name try: self.prepare() self.download() self.extract() self.copy() except Exception as e: print(str(e)) finally: self.clean() def prepare(self): r = requests.get('https://pypi.python.org/pypi/{}/{}/json'.format(self.name, self.version)) jdata = r.json() self.tarURL = jdata['urls'][-1]['url'] print('URL used : {}'.format(self.tarURL)) def download(self): print('Downloading {} v{}...'.format(self.name, self.version)) if self.tarURL: with urllib.request.urlopen(self.tarURL) as response, open(self.tarname, 'wb') as ofile: shutil.copyfileobj(response, ofile) print('Download Complete') def extract(self): print('Extracting...') t = tarfile.open(self.tarname) t.extractall() print('Package extracted') def copy(self): # If source is a folder if os.path.isdir(self.tarfolder + '/' + self.module_name): if os.path.isdir(self.module_name): print('Removing old package directory...') shutil.rmtree(self.module_name) print('Installing package directory...') shutil.move(self.tarfolder + '/' + self.module_name, './' + self.module_name) else: # if source is a file file = self.module_name + '.py' if os.path.isfile(self.tarfolder + '/' + file): if os.path.isfile(file): print('Removing old package file...') os.remove(file) print('Installing package file...') shutil.move(self.tarfolder + '/' + file, './' + file) def clean(self, keep_module=True): print('Cleaning up...') if not self.keep_source: if os.path.isdir(self.tarfolder): print('Removing source directory...') shutil.rmtree(self.tarfolder) if not self.keep_tarball: if os.path.isfile(self.tarname): print('Removing source tarball...') os.remove(self.tarname) if not keep_module: if os.path.isdir(self.module_name): print('Removing module directory...') shutil.rmtree(self.module_name) elif os.path.isfile('{}.py'.format(self.module_name)): print('Removing module file...') os.remove('{}.py'.format(self.module_name)) print('Done.')

Enjoy!

D