7
votes

Solution de contournement Emacs et Conda

J'utilise emacs et anaconda.

J'ai ceci dans mon init.el:

pyvenv-workon
  Work on:  (empty)

Et conda sur mon chemin:

conda-env-list

*Conda envs*

mais emacs ne trouve pas mes environnements conda, ce que je crois comprendre qu'il est censé pouvoir le faire ..

Donc, quand j'exécute Cc Cp pour démarrer une nouvelle session, et Cc Cc , il ne parvient pas à importer mes packages qui sont installés dans un environnement conda, avec ModuleNotFoundError .

Depuis que j'ai ajouté ceci à mon chemin et que cela ne fonctionne toujours pas, j'essaie de contourner ce problème, et je peux toujours exécuter mes applications conda à partir d'emacs.

Je peux ouvrir un shell dans emacs avec Mx shell , puis source activate myenv , et exécuter python.

I veulent maintenant que Cc Cc copie dans / this / shell . Comment marquer ce shell tampon comme un processus python vers lequel envoyer le texte de mon file.py sur Cc Cc, plutôt que juste un shell shell ?

Update1

J'ai également regardé les références suivantes:

Mais aucun des deux packages ne fonctionne pour moi. J'obtiens toujours, quand j'essaye:

# added by Anaconda3 installer
export PATH="/home/user/anaconda3/bin:$PATH"

Produit un tampon vide.

Et ceci pour pyvenv-workon:

(setenv "WORKON_HOME" "/home/user/anaconda3/envs/")

Ces environnements existent très bien, et il est impossible d'utiliser emacs comme un IDE python si je ne peux pas exécuter mon code.


1 commentaires

Pas tout à fait sûr, mais regardez la variable exec-path d'Emacs, c'est là qu'Emacs recherche les programmes à exécuter. Quant au chargement d'un environnement virtuel, ce qui fonctionne pour moi, c'est d'appeler pyvenv-activate .


4 Réponses :


7
votes

Les programmes héritent des variables d'environnement du shell qui les a engendrées. La façon dont conda et virtualenv fonctionnent est de surcharger la variable PATH du shell. Ils font cela pour que le système d'exploitation trouve la nouvelle version de l'application (conda ou virtualenv) au lieu de celle par défaut installée avec le système d'exploitation (les Mac sont livrés avec une ancienne version de python).

Alors, que se passe-t-il ici? Si vous démarrez Emacs en double-cliquant sur l'icône du système d'exploitation, il héritera des variables d'environnement shell par défaut. Ainsi, lorsque vous essayez d'appeler une bibliothèque que vous avez installée avec conda (ou de manière équivalente avec virtualenv et pip), car vous utilisez le chemin d'accès du système d'exploitation par défaut, le système d'exploitation trouve la version par défaut de python (et surtout les bibliothèques de la version par défaut). La version par défaut de python va répondre "Je n'ai aucune idée de quelle bibliothèque c'est."

Comment réparer? Un moyen fiable est de ne pas démarrer Emacs en double-cliquant sur l'icône du système d'exploitation. Voici ce que je fais la plupart du temps:

1) start a console/terminal
2) switch to the conda environment `activate py37` 
    (or with virtualenv: `source .py37dev/bin/activate`)
3) start Emacs from that same shell that has the modified environment variables.  
    On a Mac its: `/Applications/Emacs.app/Contents/MacOS/Emacs` 
    (I use a installed version of Emacs on the Mac because the one that 
    comes with Mac is ancient).  
    On Linux and Windows the path to EMacs will be different but the idea is the same.
4) start a shell inside Emacs and you should see the shell looks the way it does 
    in your conda shell (or virtualenv shell)

voici à quoi cela ressemble pour moi: entrez la description de l'image ici

voyez comment la version de python n'est pas le python OS par défaut? C'est celui de l'environnement virtualenv + pip (conda fonctionne exactement de la même manière, juste le démarrage d'environnements est une commande différente)


1 commentaires

Comment gérez-vous la commutation entre différents projets Python qui peuvent être dans différents environnements conda?



7
votes

Ce que j'ai trouvé qui fonctionne pour moi, c'est d'utiliser le package conda d'ELPA et de définir deux de ses variables de configuration pour qu'elles pointent vers mon répertoire Conda. L'extrait suivant fait l'affaire dans mon .emacs :

(use-package conda
  :ensure t
  :init
  (setq conda-anaconda-home (expand-file-name "~/miniconda3"))
  (setq conda-env-home-directory (expand-file-name "~/miniconda3")))
  • conda-anaconda-home est l'équivalent de la variable d'environnement ANACONDA_HOME (c'est-à-dire contient tous les fichiers de votre installation Anaconda)
  • conda-env-home-directory - est le répertoire dans lequel vos environnements virtuels sont stockés (dans le sous-répertoire envs )

Avec cette configuration, je peux exécuter M-x conda-env-activate et avoir accès à tous les envs créés précédemment.


4 commentaires

Cela l'a fait pour moi. Merci!


Merci, cela a fonctionné pour moi, mais maintenant, lors de l'activation d'un env, il est dit Recherche de programme: aucun fichier ou répertoire de ce type, python après avoir exécuté run-python , il semble ne pas trouver python.exe avec l'environnement env.


@ElBaulP, sonne comme un problème de PATH . Essayez d'ajouter quelque chose comme ceci à votre .emacs : (add-to-list 'exec-path "~ / miniconda3 / bin") (setenv "PATH" "~ / miniconda3 / bin: $ PATH" '("PATH"))


@WojciechGac Merci !, Je n'ai pas de sous-répertoire bin / , mais ~ / miniconda3 a fonctionné, car python.exe s'y trouve.



0
votes

J'ai testé les solutions données dans les réponses de Wojciech Gac , de Mittenchops et James Anderson .

Bien que la solution de la solution de James Anderson soit de loin la plus simple, elle présente quelques problèmes: Tout d'abord, vous devez réactiver l'environnement dans chaque processus shell que vous créez dans emacs. Il est également possible qu'emacs ait un chemin python différent, donc en utilisant à contrecœur le système python et non venv python.

La solution avec conda.el est quelque peu bizarre. Dans Melpa, il est répertorié comme obsolète et avec les instructions de https://github.com/necaris/conda.el il ne reconnaîtra pas les environnements sur ma certaine machine.

Sur la même machine, la solution avec pyenv comme mentionné dans https://emacs.stackexchange.com/a/20093/28567 fonctionne comme un charme.

Pour cela, il vous suffit de installer avec Mx package-install rechercher pyenv puis insérer les deux lignes suivantes dans .emacs:

(setenv "WORKON_HOME" "~/anaconda3/envs") ; /anaconda3 || /miniconda || wathever path your conda installation is located at
(pyvenv-mode 1)


0 commentaires

0
votes

Voici ma solution minimale à ce problème:

créez un fichier batch comme celui-ci

conda activate <yourEnv>
python -i

set (local) python-shell-interpreter pointant vers le batch- fichier

run-python comme toujours (Cc Cp ...)


0 commentaires