web-dev-qa-db-fra.com

Installer easy_install de Python en utilisant ez_setup.py derrière un serveur proxy

Existe-t-il un moyen d'installer easy_install de Python à l'aide de ez_setup.py sur un réseau d'entreprise utilisant un serveur proxy? Actuellement, je reçois un délai de connexion:

Downloading http://pypi.python.org/packages/2.7/s/setuptools/setuptools-0.6c11-py2.7.Egg
Traceback (most recent call last):
  File "C:\jsears\python\ez_setup.py", line 278, in <module>
    main(sys.argv[1:])
  File "C:\jsears\python\ez_setup.py", line 210, in main
    Egg = download_setuptools(version, delay=0)
  File "C:\jsears\python\ez_setup.py", line 158, in download_setuptools
    src = urllib2.urlopen(url)
  File "C:\jsears\Python27\lib\urllib2.py", line 126, in urlopen
    return _opener.open(url, data, timeout)
  File "C:\jsears\Python27\lib\urllib2.py", line 400, in open
    response = self._open(req, data)
  File "C:\jsears\Python27\lib\urllib2.py", line 418, in _open
    '_open', req)
  File "C:\jsears\Python27\lib\urllib2.py", line 378, in _call_chain
    result = func(*args)
  File "C:\jsears\Python27\lib\urllib2.py", line 1207, in http_open
    return self.do_open(httplib.HTTPConnection, req)
  File "C:\jsears\Python27\lib\urllib2.py", line 1177, in do_open
    raise URLError(err)
urllib2.URLError: <urlopen error [Errno 10060] A connection attempt failed because the connected party did not properly respond after a period of time, or established connection failed because connected Host has failed to respond>
12
jsears

Apparemment, vous pouvez simplement définir une variable d'environnement:

export http_proxy = http: // <utilisateur>: <mot de passe> @ <nom_hôte_proxy>: <port>

Par exemple:

export http_proxy = http: // admin: [email protected]: 80

6
jsears

Sous Windows 7, avec PowerShell, les paramètres de proxy ci-dessus sont ignorés et l'outil ne fonctionnera pas. Mais j'ai trouvé la solution.

J'ai modifié la routine download_file_powershell en ajoutant

[System.Net.WebRequest]::DefaultWebProxy.Credentials = [System.Net.CredentialCache]::DefaultCredentials;

à l'intérieur du script utilisé pour télécharger via la classe WebClient. Voici la fonction complète download_file_powershell:

def download_file_powershell(url, target):
"""
Download the file at url to target using Powershell (which will validate
trust). Raise an exception if the command cannot complete.
"""
target = os.path.abspath(target)
cmd = [
    'powershell',
    '-Command',
    "[System.Net.WebRequest]::DefaultWebProxy.Credentials = [System.Net.CredentialCache]::DefaultCredentials;  (new-object System.Net.WebClient).DownloadFile(%(url)r, %(target)r)" % vars(),
]
subprocess.check_call(cmd)
15
valir

Si vous avez déjà défini une variable d'environnement http_proxy/https_proxy, vous pouvez simplement indiquer à ez_setup.py de ne pas utiliser PowerShell. PowerShell n'utilise pas les variables d'environnement HTTP_PROXY/HTTPS_PROXY. Suivez la première section de cette réponse.

Pour les personnes qui pourraient ne pas savoir comment définir les variables d'environnement, voir les sections 2 et supérieures.

Empêchez ez_setup.py d'utiliser PowerShell

Allez dans le fichier ez_install.py et trouvez la section suivante:

def has_powershell():
    if platform.system() != 'Windows':
        return False
    cmd = ['powershell', '-Command', 'echo test']
    devnull = open(os.path.devnull, 'wb')
    try:
        try:
            subprocess.check_call(cmd, stdout=devnull, stderr=devnull)
        except:
            return False
    finally:
        devnull.close()
    return True

et le changer pour être

def has_powershell():
     return False

ez_install.py utilisera votre environnement HTTP_PROXY/HTTPS_PROXY, qui peut être défini à partir de la ligne de commande ou du panneau de configuration.

Ligne de commande temporaire:

set HTTP_PROXY=http://proxy.example.com
set HTTPS_PROXY=https://proxy.example.com

Remarque: Si vous procédez ainsi, vous devez exécuter 'python ez_setup.py' dans la même fenêtre de commande que celle dans laquelle vous avez exécuté ces commandes.

Ligne de commande permanente (utilisateur uniquement):

setx HTTP_PROXY "http://proxy.example.com"
setx HTTPS_PROXY "https://proxy.example.com"

Ligne de commande permanente (Machine aka Tous les utilisateurs):

setx HTTP_PROXY "http://proxy.example.com" /M
setx HTTPS_PROXY "https://proxy.example.com" /M

Permanent via le Panneau de configuration:

  1. Démarrer -> Panneau de configuration -> Comptes d'utilisateurs
  2. Sur le panneau de gauche, cliquez sur "Modifier mes variables d’environnement".
  3. Cliquez sur "Nouveau .." dans "Variables utilisateur" ou "Variables système" (selon ce que vous voulez).
  4. Définir le nom de la variable: HTTP_PROXY et la valeur de la variable: http: /proxy.example.com
  5. Cliquez sur "Nouveau .." dans "Variables utilisateur" ou "Variables système" (selon ce que vous voulez).
  6. Nom de la variable: HTTPS_PROXY et valeur de la variable: https: /proxy.example.com
  7. Cliquez sur OK'
7
Andrew Martinez

vous pouvez également définir dans votre code:

import urllib2

proxy = urllib2.ProxyHandler({'http':'http://username:password@proxy_Host:port'})
auth = urllib2.HTTPBasicAuthHandler()
opener = urllib2.build_opener(proxy, auth, urllib2.HTTPHandler)
urllib2.install_opener(opener)
4
namit

Je viens de rencontrer le même problème et c'est la solution que j'ai trouvée. J'admets que ce n'est pas idéal, mais c'est le seul moyen que j'ai trouvé pour résoudre ce problème sous Windows.

  1. Télécharger. ez_setup.py.
  2. Editez la ligne suivante pour vous montrer où le fichier s’attend à télécharger le package compressé:

imprimer saveto

def download_setuptools(version=DEFAULT_VERSION, download_base=DEFAULT_URL,
                        to_dir=os.curdir, delay=15,
                        downloader_factory=get_best_downloader):
# making sure we use the absolute path
to_dir = os.path.abspath(to_dir)
tgz_name = "setuptools-%s.tar.gz" % version
url = download_base + tgz_name
saveto = os.path.join(to_dir, tgz_name)
print saveto
if not os.path.exists(saveto):  # Avoid repeated downloads
    log.warn("Downloading %s", url)
    downloader = downloader_factory()
    downloader(url, saveto)
return os.path.realpath(saveto)

Cela fournit la sortie suivante lorsque vous exécutez le script dans mon cas: "C:\Python27> python.exe ez_setup.py"

Sortie: 

C:\Python27\setuptools-1.4.2.tar.gz Téléchargement https://pypi.python.org/packages/source/s/setuptools/setuptools-1.4.2.tar.gz Exception appelant "DownloadFile" avec "2" argument (s): "Le serveur distant a renvoyé une erreur: (407) Authentification proxy requise." A la ligne: 1 char: 47 + (new-object System.Net.WebClient) .DownloadFile <<<< (' https://pypi.python.org/packages/source/s/setuptools/setuptools-1.4.2.tar. gz ',' C:\Python27\setuptools-1.4.2.tar.gz ') + CategoryInfo: NotSpecified: (:) [], MethodInvocationException + FullyQualifiedErrorId: DotNetMethodException

  1. Téléchargez le pack à partir du lien https ci-dessus et placez-le à l'emplacement prévu dans mon cas "C:\Python27 \"

Ce fichier placé à l'emplacement déclenche cette instruction logique:

if not os.path.exists(saveto):  # Avoid repeated downloads
    log.warn("Downloading %s", url)
    downloader = downloader_factory()
    downloader(url, saveto)
return os.path.realpath(saveto)

Comme par magie, le paquet sera installé. 

0
LeeO