Comment utiliser pip sur Windows derrière un proxy d'authentification

90

Mon ordinateur exécute Windows derrière un proxy sur un serveur Windows (en utilisant Active Directory), et je ne peux pas comprendre comment y arriver avec pip(en python3). J'ai essayé d'utiliser --proxy, mais il ne reste que des délais d'attente. J'ai également essayé de définir un délai d'attente long (60 s), mais cela ne faisait aucune différence. Mes paramètres de proxy sont corrects et je les ai comparés à ceux que j'utilise avec succès dans TortoiseHG pour m'en assurer.

Y a-t-il d'autres astuces que quelqu'un connaît et que je peux essayer, ou y a-t-il des limitations en pipce qui concerne les proxies Windows?

Mise à jour: Mes tentatives infructueuses impliquaient la recherche de pypi. Je viens d'essayer d'installer quelque chose et cela a fonctionné. La recherche échoue toujours cependant. Cela indique-t-il un bogue pipou fonctionnent-ils différemment?

Eau de vie
la source

Réponses:

107

J'ai essayé 2 options qui fonctionnent toutes les deux sur le proxy authentifié NTLM de mon entreprise. L'option 1 consiste à utiliser--proxy http://user:pass@proxyAddress:proxyPort

Si vous rencontrez toujours des problèmes, je suggérerais d'installer un service d'authentification proxy (j'utilise CNTLM ) et de pointer pip dessus, c'est-à-dire quelque chose comme--proxy http://localhost:3128

Russell
la source
1
L'outil CNTLM est activement maintenu et semble fonctionner très bien.
Michał Fita
6
Je ne pouvais pas le faire fonctionner, peu importe toutes les tentatives que j'ai faites
eusoubrasileiro
2
Si vous avez des caractères spéciaux dans votre mot de passe ou nom d'utilisateur, échappez-le simplement avec \ avant le caractère spécial. Ça fonctionne bien.
Arockia
est-ce que je comprends bien que vous dites à pip d'envoyer la demande au proxy, en s'authentifiant avec l'utilisateur et le mot de passe donnés via une connexion http? Cela signifie que votre mot de passe sera envoyé non crypté au serveur proxy, non !? Cela me semble être un gros risque de sécurité ou est-ce que je manque quelque chose?
Robert
Cela a fonctionné pour moi avec un pare
Raúl Salinas-Monteagudo
64

Cela m'a pris quelques heures pour comprendre cela, mais je l'ai finalement fait fonctionner en utilisant CNTLM et ensuite je l'ai fait fonctionner avec juste un fichier de configuration pip. Voici comment je l'ai fait fonctionner avec le fichier de configuration pip ...

Solution:

1. Sous Windows, accédez au répertoire de votre profil utilisateur (Ex. C: \ Users \ Sync) et créez un dossier nommé " pip "

2. Créez un fichier nommé " pip.ini " dans ce répertoire (Ex. C: \ Users \ Sync \ pip \ pip.ini) et entrez ce qui suit:

    [global]
    trusted-host = pypi.python.org
                   pypi.org
                   files.pythonhosted.org
    proxy = http://[domain name]%5C[username]:[password]@[proxy address]:[proxy port]

Remplacez [nom de domaine] , [nom d'utilisateur] , [mot de passe] , [adresse proxy] et [port proxy] par vos propres informations.

Notez que si votre [nom de domaine] , [nom d'utilisateur] ou [mot de passe] comporte des caractères spéciaux, vous devez encoder en pourcentage | les encoder .

3. À ce stade, j'ai pu exécuter " pip install " sans aucun problème.

Espérons que cela fonctionne aussi pour d'autres!

PS: Cela peut poser un problème de sécurité car votre mot de passe est stocké en texte brut. Si c'est un problème, envisagez de configurer CNTLM à l'aide de cet article (permet d'utiliser un mot de passe haché au lieu du texte brut). Ensuite, défini proxy = 127.0.0.1:3128dans le fichier "pip.ini" mentionné ci-dessus.

Synchroniser
la source
2
Pour en savoir plus sur l'emplacement de pip.ini, cliquez ici . Vous pouvez définir PIP_CONFIG_FILEla variable d'environnement pour qu'elle pointe vers le fichier
pip.ini
1
Aimer!!!! si propre - rappelez-vous simplement que la plupart des proxies vous permettront d'entrer manuellement votre mot de passe. Ne laissez JAMAIS votre mot de passe en clair!
avgvstvs
1
Un autre paramètre global très important peut être ajouté ici est le site miroir, par exemple, ajouter "index-url = pypi.tuna.tsinghua.edu.cn/simple " augmenterait beaucoup la vitesse de téléchargement de pip en RPC Chine. Et le fichier correspondant sous Linux est ~ / .pip / pip.conf
TingQian LI
4
qu'est-ce que [nom de domaine]?
Alex B
1
@AlexB, [nom de domaine] fait référence à votre nom de domaine Windows
Mike Pennington
45

Voici comment je l'ai configuré:

  1. Ouvrez l'invite de commande (CMD) en tant qu'administrateur.
  2. Exportez les paramètres proxy:

    set http_proxy=http://username:password@proxyAddress:port

    set https_proxy=https://username:password@proxyAddress:port

  3. Installez le package que vous souhaitez installer:

    pip install PackageName

Par exemple:

Exemple

Heinrich Cloete
la source
4
C'est certainement la première chose à essayer. Python est multiplateforme, et c'est l'équivalent de ce que nous faisons normalement sous Linux. Il y a eu des problèmes sur Windows (derrière le même proxy) où l' --proxyargument ne l'aurait tout simplement pas du tout, mais l'approche standard env var a fonctionné pour la première fois. Pour mémoire, nous avons également décidé no_proxyd'éviter que d'autres requêtes internes tentent de sortir via le proxy.
randomsock
ne fonctionne pas pour moi sur win10. utiliser un outil de console émulateur comme cygwinou cmderpuis faire le chemin linux: export http_proxy=<proxy>et export https_proxy=<proxy>puis le fairepip install <package>
Bucky
Cela a fonctionné pour moi mais l' --proxyindicateur de ligne de commande n'a jamais fonctionné. Windows 10
AmbroseChapel
15

J'ai rencontré le même problème sur Windows 7. J'ai réussi à le faire fonctionner en créant un dossier "pip" avec un fichier "pip.ini" à l'intérieur. J'ai mis ce dossier dans "C: \ Users \ {my.username} \ AppData \ Roaming", car selon la documentation Python:

Sous Windows, le fichier de configuration est% APPDATA% \ pip \ pip.ini

Dans le fichier pip.ini, je n'ai que:

[global]
proxy = [proxy address]:[proxy port]

Donc pas de nom d'utilisateur: mot de passe. Et cela fonctionne très bien.

stann1
la source
1
Dans mon cas, cela ne fonctionne que si je mets mon nom d'utilisateur et mon mot de passe en texte clair dans ce fichier ...: / Pourquoi tout le reste du CMD fonctionne-t-il comme "ping XYZ". Pourquoi pip n'utilise-t-il pas les paramètres IE?
hmrc87
7

J'ai eu un problème similaire et j'ai constaté que mon entreprise utilise l'authentification proxy NTLM. Si vous voyez cette erreur dans votre pip.log, c'est probablement le problème:

Impossible d'extraire l'URL http://pypi.python.org/simple/pyreadline : Erreur HTTP 407: authentification du proxy requise (le serveur ISA a besoin d'une autorisation pour répondre à la demande. L'accès au filtre du proxy Web est refusé.)

NTLMaps peut être utilisé pour s'interfacer avec le serveur proxy NTLM en devenant un proxy intermédiaire.

Téléchargez les NTLMAP, mettez à jour le server.cfg inclus, exécutez le fichier main.py, puis pointez le paramètre proxy de pip sur 127.0.0.1 :.

J'avais également besoin de modifier ces valeurs par défaut dans le server.cfgfichier en:

LM_PART:1
NT_PART:1

# Highly experimental option. See research.txt for details.
# LM - 06820000
# NT - 05820000
# LM + NT - 
NTLM_FLAGS: 07820000

http://ntlmaps.sourceforge.net/

Monkut
la source
1

Vous pouvez également rencontrer des problèmes avec les certificats de votre proxy. Il y a beaucoup de réponses ici sur la façon de récupérer le certificat de votre proxy.

Sur un hôte Windows, pour permettre à pip d'effacer votre proxy, vous pouvez définir une variable d'environnement telle que:

PIP_CERT=C:\path\to\certificate\file\in\pem\form\myproxycert.pem

Vous pouvez également utiliser l' --certargument to PIPavec le même résultat.

cincypiper
la source
1

J'ai eu le même problème sur un environnement Windows distant. J'ai essayé de nombreuses solutions trouvées ici ou sur d'autres articles similaires mais rien n'a fonctionné. Enfin, la solution était assez simple. J'ai dû définir NO_PROXYavec cmd:

set NO_PROXY="<domain>\<username>:<password>@<host>:<port>"
pip install <packagename>

Vous devez utiliser des guillemets doubles et mettre NO_PROXYen majuscules. Vous pouvez également l'ajouter en NO_PROXYtant que variable d'environnement au lieu de la définir chaque fois que vous utilisez la console.

J'espère que cela aidera si une autre solution publiée ici fonctionne.

EL Manu
la source
1

installez cntlm: Cntlm: Proxy d'authentification NTLM rapide en C

Config cntlm.ini:

Nom d'utilisateur ob66759

Domaine NAM

Mot de passe secret

Proxy proxy1.net:8080

Proxy proxy2.net:8080

NoProxy localhost, 127.0.0. *, 10. *, 192.168. *

Écouter 3128

Autoriser 127.0.0.1

#Ton ip

Autoriser 10.106.18.138

démarrer:

cntlm -v -c cntlm.ini

Maintenant dans cmd.exe:

pip install --upgrade pip --proxy 127.0.0.1:3128

Collecting pip
  Downloading https://files.pythonhosted.
44c8a6e917c1820365cbebcb6a8974d1cd045ab4/

    100% |███████████████████████████████
Installing collected packages: pip
  Found existing installation: pip 9.0.1
    Uninstalling pip-9.0.1:
      Successfully uninstalled pip-9.0.1

Successfully installed pip-10.0.1

travaux!

Vous pouvez également masquer le mot de passe: https://stormpoopersmith.com/2012/03/20/using-applications-behind-a-corporate-proxy/

Alex B
la source
1

même problème sur windows10 et les solutions supérieures ne fonctionnent pas pour moi.

utilisez un outil de console d'émulation comme cygwin, puis faites-le de la manière linux par défaut:

export http_proxy=<proxy>
export https_proxy=<proxy>
pip install <package>

et les choses fonctionnent bien.

bucky
la source
sous Windows 10, avec authentification proxy, cela fonctionne pour moi: en utilisant cntlm comme proxy intermédiaire, puis à l'invite msdos: "set https_proxy = localhost: 3128" puis "pip install -U setuptools == 41.0.1"
mrtexaz