Module Python et Emacs

8 réponses
Avatar
lionmarron
Bonjour,

Je ne sais pas si le problème est connu, et j'imagine qu'il devrait être
facile à résoudre (mais l'expérience apprend à être méfiant) :

Il s'agit de scripts Python lancé depuis Emacs, et des modules situés
dans le répertoire courant provoquent :

ImportError: No module named <nom module>

En mode direct depuis Emacs même message d'erreur. Pourtant Tkinter est
trouvé, donc c'est seulement les modules situés dans le répertoire
courant qui ne sont pas trouvés.

En revanche si Python lancé depuis le terminal (l'histoire se passe sous
ubuntu) les mêmes modules sont trouvés.

Je pourrais peut-être essayer de mettre mes modules aux même endroit que
ceux fourni avec Python, mais il me semble que tel n'est pas l'usage.

--
lionmarron

8 réponses

Avatar
Daimrod
lionmarron writes:

Bonjour,

Je ne sais pas si le problème est connu, et j'imagine qu'il devrait
être facile à résoudre (mais l'expérience apprend à   être méfiant) :

Il s'agit de scripts Python lancé depuis Emacs, et des modules situ és
dans le répertoire courant provoquent :

ImportError: No module named <nom module>

En mode direct depuis Emacs même message d'erreur. Pourtant Tkinter
est trouvé, donc c'est seulement les modules situés dans le r épertoire
courant qui ne sont pas trouvés.

En revanche si Python lancé depuis le terminal (l'histoire se passe
sous ubuntu) les mêmes modules sont trouvés.

Je pourrais peut-être essayer de mettre mes modules aux même en droit
que ceux fourni avec Python, mais il me semble que tel n'est pas
l'usage.



Bonjour,

après quelques tests, j'ai vu qu'il fallait d'abord charger les fichie rs
C-c C-l et ensuite indiquer quel fichier on souhaitait utiliser avec
C-c C-c

# ex1.py

def hello ():
print("Hello")

# ex2.py

from ex1 import hello

def test ():
hello()

C-x C-f ex1.py
C-c C-l RET
C-x C-f ex2.py
C-c C-l RET
C-c C-c
C-c C-z
test() RET
Avatar
Vivien MOREAU
Bonjour,

lionmarron writes:

Je ne sais pas si le problème est connu, et j'imagine qu'il devrait
être facile à résoudre (mais l'expérience apprend à être méfiant) :

Il s'agit de scripts Python lancé depuis Emacs, et des modules situés
dans le répertoire courant provoquent :

ImportError: No module named <nom module>

En mode direct depuis Emacs même message d'erreur. Pourtant Tkinter
est trouvé, donc c'est seulement les modules situés dans le répertoire
courant qui ne sont pas trouvés.



Es-tu sûr que ce que tu appelles le répertoire courant est réellement le
répertoire courant de ton Emacs ? As-tu lancé Emacs depuis ce répertoire
? Ou bien as-tu lancé la fonction cd d'Emacs pour changer de répertoire
courant ? Si ce n'est pas le cas, il y a de fortes chances que le
répertoire courant de ton Emacs soit en fait ${HOME}.

En revanche si Python lancé depuis le terminal (l'histoire se passe
sous ubuntu) les mêmes modules sont trouvés.

Je pourrais peut-être essayer de mettre mes modules aux même endroit
que ceux fourni avec Python, mais il me semble que tel n'est pas
l'usage.



Effectivement, ça serait très sale et inutile :-)

--
Librement,
Vivien
Avatar
Paul Gaborit
À (at) Mon, 28 Nov 2011 01:58:37 +0100,
lionmarron écrivait (wrote):

Il s'agit de scripts Python lancé depuis Emacs, et des modules situés
dans le répertoire courant provoquent :

ImportError: No module named <nom module>

En mode direct depuis Emacs même message d'erreur. Pourtant Tkinter
est trouvé, donc c'est seulement les modules situés dans le répertoire
courant qui ne sont pas trouvés.

En revanche si Python lancé depuis le terminal (l'histoire se passe
sous ubuntu) les mêmes modules sont trouvés.

Je pourrais peut-être essayer de mettre mes modules aux même endroit
que ceux fourni avec Python, mais il me semble que tel n'est pas
l'usage.



Ce n'est pas un problème lié à Emacs mais à Python. Il faut regarder du
côté de la variable sys.path (et éventuellement du côté de
site.getusersitepackages()).

Exécuter le script suivant dans les différents contextes (emacs,
terminal, etc.) et vous comprendrez la différence :

# début python
import sys
import site
print sys.path
print site.getusersitepackages()
# fin python



--
Paul Gaborit - <http://perso.mines-albi.fr/~gaborit/>
Avatar
lionmarron
Le 28/11/2011 08:45, Paul Gaborit a écrit :


Ce n'est pas un problème lié à Emacs mais à Python. Il faut regarder du
côté de la variable sys.path (et éventuellement du côté de
site.getusersitepackages()).

Exécuter le script suivant dans les différents contextes (emacs,
terminal, etc.) et vous comprendrez la différence :

# début python
import sys
import site
print sys.path
print site.getusersitepackages()
# fin python



C'est là que je me rend compte des limites de mes connaissance du
système Linux, ou de l'informatique en général. Il faudra sans doute que
je consulte ma documentation Linux ; toujours est-il que je ne comprends
pas bien ce qu'affiche ce script.

print sys.path n'affiche pas les mêmes choses depuis Emacs et depuis le
terminal. On dirait une liste au format python et le premier élément de
la liste n'est pas le même. Je comprends que la différence doit venir de
ceci : Avant lancer un script depuis le terminal je me mets dans le
dossier de ce script, alors qu'avant de lancer un script depuis Emacs
c'est peut-être seulement la fonction de chargement de fichier qui se
met dans ledit dossier.

print site.getusersitepackages() affiche la même chose depuis Emacs ou
le terminal :

/home/andre/.local/lib/python2.7/site-packages

Je me suis dit que cela voulait peut-être dire qu'il fallait mettre mes
modules dans site-packages, mais je préfère être sûr car je trouve
bizarre de les mettre dans un dossier caché.

De plus les sous-dossiers pointés n'existent pas, donc je suppose qu'il
faut sans doute les créer, mais là aussi j'aimerais autant être sûr. (On
ne sait jamais.)

--
lionmarron
Avatar
lionmarron
On 28 nov, 17:07, lionmarron wrote:

/home/andre/.local/lib/python2.7/site-packages

Je me suis dit que cela voulait peut-être dire qu'il fallait mettre mes
modules dans site-packages, mais je préfère être sûr car je trouv e
bizarre de les mettre dans un dossier caché.

De plus les sous-dossiers pointés n'existent pas,



Ce que j'ai voulu dire est que /home/andre/.local existent, alors
que /lib/python2.7/site-packages n'existent pas.


lionmarron
Avatar
lionmarron
Le 28/11/2011 08:20, Vivien MOREAU a écrit :

Es-tu sûr que ce que tu appelles le répertoire courant est réellement le
répertoire courant de ton Emacs ? As-tu lancé Emacs depuis ce répertoire
? Ou bien as-tu lancé la fonction cd d'Emacs pour changer de répertoire
courant ?


Le fait est que je ne connais pas la fonction cd d'Emacs. Cette solution
sera peut-être adaptée, mais comme on m'en propose apparemment deux
autres je ne sais pas encore chercher cette fonction (sauf pour voir que
je ne la trouvais pas dans les menus).

Si ce n'est pas le cas, il y a de fortes chances que le
répertoire courant de ton Emacs soit en fait ${HOME}.



J'ai déjà pas mal de documentation (dont un livre en anglais), mais je
ne la comprends pas toujours et je n'ai pas vraiment eu le temps de
l'étudier.

--
lionmarron
Avatar
lionmarron
Le 28/11/2011 08:17, Daimrod a écrit :

après quelques tests, j'ai vu qu'il fallait d'abord charger les fichiers
C-c C-l et ensuite indiquer quel fichier on souhaitait utiliser avec
C-c C-c

# ex1.py

def hello ():
print("Hello")

# ex2.py

from ex1 import hello

def test ():
hello()

C-x C-f ex1.py
C-c C-l RET
C-x C-f ex2.py
C-c C-l RET
C-c C-c
C-c C-z
test() RET



Je ne sais pas si cette solution est la plus adaptée et je n'ai pas
l'impression de bien la comprendre, mais elle à l'air de marcher et donc
c'est celle que je vais utiliser dans un premier temps.

Donc merci pour cette réponse ainsi que pour celles de Vivien et de Paul.

--
lionmarron
Avatar
Daimrod
lionmarron writes:

Le 28/11/2011 08:17, Daimrod a écrit :

après quelques tests, j'ai vu qu'il fallait d'abord charger les fic hiers
C-c C-l et ensuite indiquer quel fichier on souhaitait utiliser avec
C-c C-c

# ex1.py

def hello ():
print("Hello")

# ex2.py

from ex1 import hello

def test ():
hello()

C-x C-f ex1.py
C-c C-l RET
C-x C-f ex2.py
C-c C-l RET
C-c C-c
C-c C-z
test() RET



Je ne sais pas si cette solution est la plus adaptée et je n'ai pas
l'impression de bien la comprendre, mais elle à l'air de marcher et
donc c'est celle que je vais utiliser dans un premier temps.

Donc merci pour cette réponse ainsi que pour celles de Vivien et de Paul.



En fait ce qu'il se passe c'est qu'il faut charger dans l'interpréteur
python les fichiers (avec C-c C-l qui équivaut apparement à la di rective
import) et ensuite charger le fichier principal (avec C-c C-c) qui
envoie le buffer courant à l'interpréteur.

Je suppose que, comme cela a été expliqué précédem ment, le répertoire
courant vu par l'interpréteur python n'est pas le même que celui
d'Emacs. Il faut donc indiquer où sont les modules (avec C-c C-l) et
ensuite les interprétés (avec C-c C-c).

Vu que je ne fais que très peu de python je ne garantis rien, mais cela
me semble une explication raisonale.