web-dev-qa-db-fra.com

Sous OS X El Capitan, je ne peux pas mettre à niveau un package python dépendant des six utilitaires de compatibilité NOR puis-je supprimer six

J'essaie d'utiliser le grattage, mais j'ai un problème.

à partir de six.moves, importez xmlrpc_client en tant que xmlrpclib

ImportError: impossible d'importer le nom xmlrpc_client

Ensuite, j'ai essayé pip install --upgrade six scrape, mais:

  Found existing installation: six 1.4.1
    DEPRECATION: Uninstalling a distutils installed project (six) has been deprecated and will be removed in a future version. This is due to the fact that uninstalling a distutils project will only partially uninstall the project.
Uninstalling six-1.4.1:
Exception:
Traceback (most recent call last):
  File "/Library/Python/2.7/site-packages/pip/basecommand.py", line 211, in main
status = self.run(options, args)
  File "/Library/Python/2.7/site-packages/pip/commands/install.py", line 311, in run
root=options.root_path,
  File "/Library/Python/2.7/site-packages/pip/req/req_set.py", line 640, in install
requirement.uninstall(auto_confirm=True)
  File "/Library/Python/2.7/site-packages/pip/req/req_install.py", line 716, in uninstall
paths_to_remove.remove(auto_confirm)
  File "/Library/Python/2.7/site-packages/pip/req/req_uninstall.py", line 125, in remove
renames(path, new_path)
  File "/Library/Python/2.7/site-packages/pip/utils/__init__.py", line 315, in renames
shutil.move(old, new)
  File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/shutil.py", line 302, in move
copy2(src, real_dst)
  File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/shutil.py", line 131, in copy2
copystat(src, dst)
  File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/shutil.py", line 103, in copystat
os.chflags(dst, st.st_flags)

OSError: [Errno 1] Operation not permitted: '/var/folders/3h/r_2cxlvd1sjgzfgs4xckc__c0000gn/T/pip-5h86J8-uninstall/System/Library/Frameworks/Python.framework/Versions/2.7/Extras/lib/python/six-1.4.1-py2.7.Egg-info'
34
R.hui

Solution rapide:

Je viens de contourner ce que je pense être le même problème. Vous pourriez envisager d'essayer ceci (Sudo, si nécessaire):

pip install scrape --upgrade --ignore-installed six

Github est finalement l'endroit où j'ai obtenu cette réponse (et il y a quelques autres suggestions que vous pourriez envisager si celle-ci ne résout pas votre problème). Il semble également que ce soit un problème d'El Capitan.

En outre, cela pourrait être techniquement un en double . Mais la réponse de l'autre article a été d'installer votre propre Python plutôt que de compter sur le Python osx par défaut, ce qui me semble plus laborieux.


Correction plus longue et réelle:

Finalement, je suis tombé sur une situation où j'avais réellement besoin de mettre à niveau six pour installer d'autres bibliothèques, auquel cas ignorer n'était pas suffisant. La façon la plus simple de mettre à niveau six pour moi était de ne pas utiliser pip, mais de télécharger manuellement le .tar.gz de la page de six , décompressez, déplacez-vous vers le répertoire de six packages décompressé et exécutez l'installation manuellement (Sudo, si nécessaire):

python setup.py install

Merci à cette réponse pour les conseils.

52
stephenlechner

Je ne pense pas que ce soit un doublon, mais en fait ce problème discuté ici sur la liste des problèmes du référentiel pip GitHub .

REMARQUE: Selon le package que vous installez, vous devrez peut-être modifier la commande référencée dans la solution. Dans mon cas ci-dessous, j'essayais de configurer virtualenv et virtualwrapper. Si vous ne parvenez pas à installer aws-cli ou tout autre paquet, insérez simplement cela dans le script

Le cœur du problème est lié au nouveau SIP d'Apple qu'ils ont livré avec El Capitan. Plus spécifiquement ,

python d'OS X 10.11 conserve sa propre copie de six qui est inamovible, en raison des modifications que Apple a apportées à leur distribution python. 1.4.1 n'est pas le dernier, 1.10.0 l'est. Il arrive également tôt dans le chemin d'importation de leur python, donc il remplacera généralement les versions ultérieures que vous installez.

Je suggère d'utiliser un autre python pour l'instant. Python.org, ou installé via Homebrew, ou Anaconda Python.

Il y a une discussion incroyablement détaillée sur le Ask Different Stack Exchange qui couvre comment les problèmes avec SIP ont été identifiés, résolus et évolués depuis la version originale d'El Capitan. Bien que je l'ai trouvé fascinant, vous passerez moins de temps à suivre les instructions ci-dessous qu'il ne vous en faudrait pour le lire, donc je vous recommande de le vérifier APRÈS avoir terminé ce qui suit ...

J'ai rencontré exactement la même erreur lors de la tentative de mise à niveau de VirtualEnv et VirtualEnvWrapper. Il y avait plusieurs suggestions lancées autour de ce fil ci-dessus, mais à la fin le plus stable était de

  1. Tirez parti de la prise en charge intégrée de Sudo OPTION pour spécifier une variable d'environnement HOME
$ man Sudo

  -H   The -H (HOME) option option sets the HOME environment variable 
        to the home directory of the target user (root by default) as specified 
        HOME environment variable depends on sudoers(5) settings.  By default, 
        Sudo will set HOME if env_reset or always_set_home are set, or if
        set_home is set and the -s option is specified on the command line.
  1. Tirez parti des options de pip pour forcer une mise à niveau et ignorer les packages préexistants
$ pip install --help | grep upgrade

  -U, --upgrade   Upgrade all specified packages to the newest available 
        version. This process is recursive regardless of whether a dependency 
        is already satisfied.

beejhuff@ignatius:~/mac_setup$ pip install --help | grep ignore-installed

  -I, --ignore-installed  Ignore the installed packages (reinstalling instead).

Tout d'abord, ma tentative et erreur d'origine:

$ Sudo pip install virtualenv virtualenvwrapper

The directory '/Users/beejhuff/Library/Caches/pip/http' or its parent directory 
is not owned by the current user and the cache has been disabled. 
Please check the permissions and owner of that directory. If executing 
pip with Sudo, you may want Sudo's -H flag.

The directory '/Users/beejhuff/Library/Caches/pip' or its parent directory 
is not owned by the current user and caching wheels has been disabled. 
check the permissions and owner of that directory. If executing pip with 
Sudo, you may want Sudo's -H flag.

Collecting virtualenv
  Downloading virtualenv-15.0.0-py2.py3-none-any.whl (1.8MB)
    100% |████████████████████████████████| 1.8MB 335kB/s 
Collecting virtualenvwrapper
  Downloading virtualenvwrapper-4.7.1-py2.py3-none-any.whl
Collecting virtualenv-clone (from virtualenvwrapper)
  Downloading virtualenv-clone-0.2.6.tar.gz
Collecting stevedore (from virtualenvwrapper)
  Downloading stevedore-1.12.0-py2.py3-none-any.whl
Collecting pbr>=1.6 (from stevedore->virtualenvwrapper)
  Downloading pbr-1.8.1-py2.py3-none-any.whl (89kB)
    100% |████████████████████████████████| 92kB 362kB/s 
Collecting six>=1.9.0 (from stevedore->virtualenvwrapper)
  Downloading six-1.10.0-py2.py3-none-any.whl
Installing collected packages: virtualenv, virtualenv-clone, pbr, six, stevedore, virtualenvwrapper
  Running setup.py install for virtualenv-clone ... done
  Found existing installation: six 1.4.1
    DEPRECATION: Uninstalling a distutils installed project (six) has been deprecated and will be removed in a future version. This is due to the fact that uninstalling a distutils project will only partially uninstall the project.
    Uninstalling six-1.4.1:
Exception:
Traceback (most recent call last):
  File "/Library/Python/2.7/site-packages/pip-8.1.0-py2.7.Egg/pip/basecommand.py", line 209, in main
    status = self.run(options, args)
  File "/Library/Python/2.7/site-packages/pip-8.1.0-py2.7.Egg/pip/commands/install.py", line 317, in run
    prefix=options.prefix_path,
  File "/Library/Python/2.7/site-packages/pip-8.1.0-py2.7.Egg/pip/req/req_set.py", line 726, in install
    requirement.uninstall(auto_confirm=True)
  File "/Library/Python/2.7/site-packages/pip-8.1.0-py2.7.Egg/pip/req/req_install.py", line 746, in uninstall
    paths_to_remove.remove(auto_confirm)
  File "/Library/Python/2.7/site-packages/pip-8.1.0-py2.7.Egg/pip/req/req_uninstall.py", line 115, in remove
    renames(path, new_path)
  File "/Library/Python/2.7/site-packages/pip-8.1.0-py2.7.Egg/pip/utils/__init__.py", line 267, in renames
    shutil.move(old, new)
  File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/shutil.py", line 302, in move
    copy2(src, real_dst)
  File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/shutil.py", line 131, in copy2
    copystat(src, dst)
  File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/shutil.py", line 103, in copystat
    os.chflags(dst, st.st_flags)
OSError: [Errno 1] Operation not permitted: '/tmp/pip-GQL8Gi-uninstall/System/Library/Frameworks/Python.framework/Versions/2.7/Extras/lib/python/six-1.4.1-py2.7.Egg-info'

La solution

Il a fallu modifier ma commande d'installation de TROIS façons spécifiques:

  1. J'ai dû ajouter le drapeau -H À Sudo
  2. J'ai dû ajouter l'option --upgrade APRÈS le nom du package que je mettais à jour (virtualenv)
  3. J'ai dû utiliser l'indicateur --ignore-installed Et spécifier que le package six était celui à ignorer.
  4. * Remarque: la commande générale est $ Sudo -H pip install <packagename> --upgrade --ignore-installed six - remplacez <packagename> Par le package spécifique que vous devez installer`

Exemple de travail final

1st Upgrade virtualenv

$ Sudo -H pip install virtualenv --upgrade --ignore-installed six

Password:

Collecting virtualenv
  Using cached virtualenv-15.0.0-py2.py3-none-any.whl
Collecting six
  Using cached six-1.10.0-py2.py3-none-any.whl
Installing collected packages: virtualenv, six
Successfully installed six-1.4.1 virtualenv-15.0.0

2e mise à niveau de virtualenvwrapper

$ Sudo -H pip install virtualenvwrapper --upgrade --ignore-installed six

Password:

  Downloading virtualenvwrapper-4.7.1-py2.py3-none-any.whl
Collecting six
  Downloading six-1.10.0-py2.py3-none-any.whl
Collecting virtualenv (from virtualenvwrapper)
  Downloading virtualenv-15.0.0-py2.py3-none-any.whl (1.8MB)
    100% |████████████████████████████████| 1.8MB 751kB/s 
Collecting virtualenv-clone (from virtualenvwrapper)
  Downloading virtualenv-clone-0.2.6.tar.gz
Collecting stevedore (from virtualenvwrapper)
  Downloading stevedore-1.12.0-py2.py3-none-any.whl
Collecting pbr>=1.6 (from stevedore->virtualenvwrapper)
  Downloading pbr-1.8.1-py2.py3-none-any.whl (89kB)
    100% |████████████████████████████████| 92kB 417kB/s 
Installing collected packages: virtualenv, virtualenv-clone, pbr, six, stevedore, virtualenvwrapper
  Running setup.py install for virtualenv-clone ... done
Successfully installed pbr-1.8.1 six-1.4.1 stevedore-1.12.0 virtualenv-15.0.0 virtualenv-clone-0.2.6 virtualenvwrapper-4.7.1
20

Les deux réponses précédentes ne fonctionnent pas pour moi. Enfin, j'ai obtenu la solution de GitHub, aws/aws-cli , comme extrait ci-dessous.

Sous OS X, si vous voyez une erreur concernant la version de six fournie avec distutils dans El Capitan, utilisez l'option --ignore-installed:

$ Sudo pip install awscli --ignore-installed six
4
SparkAndShine

Cela fonctionnerait !!

Sudo pip install awsebcli --upgrade --ignore-installed six
1
Gaurav Magan