Pyenv est-il cassé? Python 3.x fait référence au module 2.x au démarrage en raison d'une erreur PYTHONPATH

Le début de l'affaire

Je gère Python dans l'environnement pyenv (pour être exact, pyenv-virtualenv). J'avais l'habitude d'utiliser JetBrains IDE tel que PyCharm ou ʻIntelliJ IDEA pendant un certain temps, mais quand IntelliJ IDEA a introduit son propre environnement virtuel Python (installé dans le répertoire $ HOME / pyenv4intelliJ`) , Il semble polluer l'environnement python sous pyenv et il ne démarre pas.

Apparemment, le module (Path qui spécifie) qui est chargé au démarrage de Python est étrange. Donc, cette fois, l'article pour résoudre ce problème et le ramener à la normale. En termes de contenu

--Détails des détails de l'erreur / enquête sur la cause

Ce n'est pas ici. Il s'agit essentiellement de python, mais il semble qu'un peu de connaissance de Homebrew et de pyenv viendra. J'ai vu des problèmes avec des messages d'erreur similaires sur les forums de Python et PyCharm d'origine, donc il devrait y avoir pas mal de gens qui ont des problèmes avec cette erreur ... Alors, je viendrai.

Élucidation des détails de l'erreur

Message d'erreur 1

Tout d'abord, examinons la console Python dans PyCharm et le message d'erreur lors de l'appel de Python 3 à partir du terminal.

Failed to import the site module
Your PYTHONPATH points to a site-packages dir for Python 2.x bet you are running Python 3.x!
   #Lorsqu'il est exécuté à partir de PyCharm ↓
     PYTHONPATH is currently: "/Applications/PyCharm.app/Contents/helpers/pydev"
   #Lorsqu'il est exécuté depuis le terminal ↓
     PYTHONPATH is currently: "$HOME/.pyenv/versions/3.5.1/bin/python"
     You should `unset PYTHONPATH` to fix this.

Message d'erreur 2

Ensuite, lorsque j'ai joué avec, le message d'erreur a changé comme suit.

$python
Error in sitecustomize; set PYTHONVERBOSE for traceback:
KeyError: 'PYTHONPATH'
Python 3.5.1 (default, May 19 2016, 22:59:42) 
[GCC 4.2.1 Compatible Apple LLVM 7.0.2 (clang-700.1.81)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> #Cela lancera une interface interactive

Au fait, PYTHONVERBOSE semble être la même chose que commencer par $ python -v avec des options. Il remontera au démarrage.

Résultats du sondage

Quand je lis le premier message d'erreur, cela ressemble à un avertissement indiquant que j'exécute 3.x mais que je charge des packages de site 2.x (modules?). Le deuxième message d'erreur semble être qu'une erreur s'est produite dans sitecustomize.py et PYTHONPATH est étrange. (En conclusion, c'était la même cause.)

Pour le moment, à propos de site.py

Maintenant, expliquons ce que sont le module site.py, sitecustomize.py et site-packages qui sont sortis plus tôt. (Vous pouvez le sauter et le lire)

  1. Le chemin que Python voit lors du chargement d'un module est défini dans sys.path
  2. Python définit sys.path en exécutant site.py au démarrage
  3. Est-ce une option? : Le paramètre de chemin local pour chaque projet est ajouté au chemin en exécutant sitecustomize.py ou ʻusersitecustomize.py`

Cette zone est expliquée en détail à la page suivante.

Identifiez la cause avec brew doctor

Cependant, je n'ai pas défini PYTHONPATH, et même si je lance >>> import site; site.USERSITE à partir de l'interface interactive et vérifie le chemin défini dans site.py, c'est différent. pas étrange. Pourtant……

$ python
>>> import sys
>>> sys.path
>>> sys.path
['', '$HOME/.pyenv/versions/3.5.1/lib/python35.zip',
 '$HOME/.pyenv/versions/3.5.1/lib/python3.5',
 '$HOME/.pyenv/versions/3.5.1/lib/python3.5/plat-darwin',
 '$HOME/.pyenv/versions/3.5.1/lib/python3.5/lib-dynload',
 '$HOME/.local/lib/python3.5/site-packages',
 '/usr/local/lib/python2.7/site-packages',
 '$HOME/.pyenv/versions/3.5.1/lib/python3.5/site-packages']

Quoi? Oh? ?? ?? Pour une raison quelconque, je fais référence au chemin python2.x par défaut du système Mac! Telle est la cause! !! !! Mais pourquoi faites-vous référence au chemin 2.x ...?

Ensuite, j'ai essayé "$ brew doctor".

Warning: python is symlinked to python3
This will confuse build scripts and in general lead to subtle breakage.

Warning: "config" scripts exist outside your system or Homebrew directories.
`./configure` scripts often look for *-config scripts to determine if
software packages are installed, and what additional flags to use when
compiling and linking.

Having additional scripts in your path can confuse software installed via
Homebrew if the config script overrides a system or Homebrew provided
script of the same name. We found the following "config" scripts:
    $HOME/.pyenv/shims/python-config
    $HOME/.pyenv/shims/python3-config
    $HOME/.pyenv/shims/python3.5-config
    $HOME/.pyenv/shims/python3.5m-config
Error in sitecustomize; set PYTHONVERBOSE for traceback:
KeyError: 'PYTHONPATH'

Warning: Your default Python does not recognize the Homebrew site-packages
directory as a special site-packages directory, which means that .pth
files will not be followed. This means you will not be able to import
some modules after installing them with Homebrew, like wxpython. To fix
this for the current user, you can run:
  mkdir -p $HOME/.local/lib/python3.5/site-packages
  echo 'import site; site.addsitedir("/usr/local/lib/python2.7/site-packages")' >> $HOME/.local/lib/python3.5/site-packages/homebrew.pth

C'est un peu long, mais en lisant le texte anglais,

Your default Python does not recognize the Homebrew site-packages directory
as a special site-packages directory, # ... (Ce qui suit est omis)

…… Le Python par défaut (= python3.5.1 sous pyenv) ne semble pas pouvoir lire les paquets de sites créés par homebrew (= probablement créés dans un répertoire sous $ HOME / .pyenv). Cela semble être une chose.

Je suppose. Ouais je sais.

Résumé de l'enquête sur les causes et comment y remédier

Si vous combinez le chemin que vous avez vérifié avec ʻimport sys et l'avertissement relatif à Python qui est sorti avec brew doctor`, vous pouvez voir ce qui suit.

  1. Chemin défini à partir de site.py appelé par Python → Normal
  2. Chemin défini depuis homebrew (sous $ HOME / .pyenv) → Anormal

Le chemin que vous avez défini à partir de homebrew appelle probablement site-packages dans 2.x. Le chemin que vous voyez dans ce homebrew est dans le fichier homebrew.pth dans $ HOME / .local / lib / python3.5 / site-packages. (Et site.py charge ce homebrew.pth. Peut-être.)

Quand j'ouvre l'intérieur ...

homebrew.pth


import site; site.addsitedir("/usr/local/lib/python2.7/site-packages")

bingo! !! !! Après tout, c'était ça! !! !! !! Si vous commentez ou supprimez ce contenu ...

Python est de retour! !! !! !! PyCharm reconnaît également et démarre normalement! !! !! !!

Comme mentionné ci-dessus, si vous rencontrez des problèmes avec une erreur similaire, veuillez vous y référer.

Recommended Posts

Pyenv est-il cassé? Python 3.x fait référence au module 2.x au démarrage en raison d'une erreur PYTHONPATH
À propos du point où python 3.x est resté bloqué en raison d'une erreur due à caching_sha2_password
ModuleNotFoundError: Erreur de module nommé'_bz2 'en Python dans pyenv
Erreur due à un conflit entre pythons lors de l'utilisation de gurobi