Version française de ma réponse sur Stack Overflow : Python: How to make Cloudant pick a .pac file?

Un peu de contexte : quelqu'un souhaite utiliser un module permettant d'utiliser l'API de Cloudant. Cependant, le module ne supporte les proxies que de manière basique ; c'est-à-dire ce que le module requests supporte. Et requests supporte les variables d'environnement HTTP_PROXY et HTTPS_PROXY ou le passage d'un argument proxy lors de son instanciation. La personne en question voudrait pouvoir configurer un fichier PAC (Configuration Automatique de Proxy) contenant les informations des proxies et que la configuration soit effective sans avoir à modifier l'un des 2 modules.
C'est là qu'entre en jeu le module PyPAC, qui permet justement de lire et comprendre ces fichiers PAC.

Pour contourner la situation, l'idée est de demander à PyPAC de nous renvoyer les informations des proxies et de les injecter dans les variables d'environnement HTTP_PROXY et HTTPS_PROXY nous-même. Ensuite, le reste du code se servira tout seul du proxy.

Depuis la version 0.6.0 de PyPAC, un context manager fort utile a été introduit, son utilisation est on ne peut plus simple :

from pypac import pac_context_for_url


with pac_context_for_url('https://acct.cloudant.com'):
    # Code utilisant le module Cloudant

C'est simple, rapide et sans douleur. Lorsque le code sort du context manager, les variables d'environnement sont restaurées à leur état initial.
L'exemple ci-dessus utilise une URL propre à Cloudant, mais un simple https://example.org suffirait. Il est possible qu'un proxy soit configuré différemment suivant l'URL, donc mieux vaut prévenir que guérir.

Code original

Voici le code original, ce qui n'est ni plus ni moins ce que le context manager pac_context_for_ur() fait pour vous :

import os

import pypac


# PyPAC découvrira automatiquement les paramètres du fichier PAC
pac = pypac.get_pac()

# On récupère le proxy associé à Cloudant (idem, on aurait pu utiliser n'importe quelle autre URL)
proxies = pac.find_proxy_for_url('https://acct.cloudant.com', 'cloudant.com')

# Ce qui retourne quelque chose comme : 'PROXY 4.5.6.7:8080; PROXY 7.8.9.10:8080'
# On prend la premier résultat :
proxy = 'http://{}/'.format(proxies.split()[1].rstrip(';'))

# On injecte les valeurs dans les variables d'environnement
os.environ['HTTP_PROXY'] = os.environ['HTTPS_PROXY'] = proxy

# Et le code utilisant le module Cloudant commence ici