2010-04-17 13 views
19

Estoy tratando de usar Emacs como editor de python y funciona bien cuando evalúo (Cc Cc) solo archivos individuales, pero cuando evalúo un archivo que importa otro archivo en el mismo directorio, obtengo un error que dice que el archivo no se pudo importar.Problema de importación en modo Python

¿Alguien sabe de alguna solución?

Gracias de antemano

EDIT: Por cierto, estoy usando Emacs23 en una máquina de Ubuntu.

El error fue,

ImportError: No module named hlutils 
+0

No intento faltarle el respeto, solo digo esto porque nunca he tenido problemas como este, y solo quiero asegurarme de los suyos, pero cuando intenta ejecutar el archivo normalmente con python, fuera de emacs, funciona correctamente, ¿verdad? – Nikwin

+0

Además, intente ejecutar el siguiente código python: import os print os.listdir ('.') y vea qué carpeta se imprime. – Nikwin

+0

Sí, lo escribí en Scite y funcionó. Estoy cambiando a emacs porque es un poco más dinámico (obtuvo un código de prueba para probar rápidamente, mientras que Scite simplemente ejecuta un comando python y muestra el resultado). Sin ofender tomada por supuesto :) – smith

Respuesta

0

Abrir un terminal y escriba emacs -q. Esto inicia un emacs sin cargar el archivo de inicio (.emacs). ¿Se produce el mismo comportamiento? De lo contrario, significa que hay un problema en su archivo .emacs.

Editar:

Al ejecutar una secuencia de comandos con C-c C-C desde el modo de Python Emacs, el directorio que contiene el script es no se añade al principio de sys.path. Descubrí esto al poner

import sys 
print sys.path 

en la parte superior de un script de prueba. Es por esto que Python no encuentra otros módulos que residan en el mismo directorio.

Cuando ejecuta el script desde la línea de comandos, Python agrega el directorio que contiene el script al sys.path. Es por eso que la misma secuencia de comandos funciona desde la línea de comandos.

Puede solucionar este problema mediante la edición de su archivo ~/.bashrc y agregar

export PYTHONPATH=/path/to/Python/scripts 

Después de guardar ~/.bashrc, emacs cercanos y empezar de nuevo para asegurarse de que el cambio se haga efectiva .bashrc.

+0

no, eso no funcionó – smith

+0

¿El directorio de scripts es el directorio de mi archivo o es una carpeta especial en python? intenté path/to/python como/usr/share/python pero no funcionó. lo siento, soy nuevo en Linux, en windows sé que mi carpeta python está en c:/python25, pero Linux tiene muchas carpetas llamadas python, por lo tanto, no puedo distinguir la correcta – smith

+0

@smith, lo siento, debería haber sido más claro. Cambie '/ path/to/Python/scripts' al directorio que contiene' hlutils.py'. – unutbu

0

Soy bastante malo con emacs lisp, y nunca he usado Ubuntu, por lo que lo siguiente puede requerir algunos ajustes, pero si el código funciona bien desde el shell, ¿por qué no simplemente configurar emacs para ejecutar el comando de shell? Simplemente ponga:

(defun shell-compile() 
    (interactive) 
    (shell-command (concat "python " (buffer-file-name)))) 

(add-hook 'python-mode-hook 
      (lambda() (local-set-key (kbd "\C-c\C-c") 'shell-compile))) 

en su archivo .emacs. Debe haber formas mucho más limpias de hacerlo, pero esto al menos te hará trabajar.

+0

Gracias, esto funciona bien. Pero en lugar de ejecutar un comando de shell si inicia un intérprete de Python y envía el contenido del búfer al intérprete de python, sería genial, esa es la característica que ofrece el modo de python que realmente quiero, simplemente no puede hacer que funcione;) – smith

1

Importo módulos locales desde el mismo directorio muy bien cuando se usa py-execute-buffer.

Su problema podría estar relacionado con la forma en que py-execute-buffer hace su trabajo: guarda el búfer en un archivo tmp (en el directorio py-temp-directory) y luego pasa este archivo a Python. En su caso, el sistema puede verse afectado por el directorio de archivos temporales.

Otro aspecto: py-execute-buffer hace cosas diferentes con el archivo tmp dependiendo de si existe o no un búfer de intérprete de Python. Pruebe su caso con un intérprete en ejecución y sin (simplemente elimine el buffer del intérprete).

16

Creo que el problema está en la forma en que el modo python de Emacs ejecuta Python.Si escribo M-x run-python, entonces veo esto:

>>> import sys 
>>> '' in sys.path 
False 
>>> 

mientras que si corro el intérprete de python de la cáscara, veo:

>>> import sys 
>>> '' in sys.path 
True 
>>> 

Esto parece ser debido al código siguiente en run-python de progmodes/python.el:

(let* ((cmdlist 
    (append (python-args-to-list cmd) 
     '("-i" "-c" "import sys; sys.path.remove('')"))) 

que no tiene ningún comentario, y la siguiente entrada del Registro de cambios útil:

2008-08-24 Romain Francoise <[email protected]> 

     * progmodes/python.el (run-python): Remove '' from sys.path. 

Yo diría que esto es un error en Emacs. He aquí una solución que se puede poner en el fichero .emacs:

(defun python-reinstate-current-directory() 
    "When running Python, add the current directory ('') to the head of sys.path. 
For reasons unexplained, run-python passes arguments to the 
interpreter that explicitly remove '' from sys.path. This means 
that, for example, using `python-send-buffer' in a buffer 
visiting a module's code will fail to find other modules in the 
same directory. 

Adding this function to `inferior-python-mode-hook' reinstates 
the current directory in Python's search path." 
    (python-send-string "sys.path[0:0] = ['']")) 

(add-hook 'inferior-python-mode-hook 'python-reinstate-current-directory) 
+1

Según http://twistedmatrix.com/pipermail/cvstoys-list/2003q3/000114.html, era una "solución de seguridad", otra información aquí: http://old.nabble.com/python.el: -why-remove-% 27% 27-from-sys.path-td22502790.html –

1

tengo el mismo problema, si no desea editar el fichero .emacs se puede poner esto en el comienzo de la secuencia de comandos:

import sys 
import os 
sys.path.append(os.getcwd()) 

añade la dirrectory de trabajo actual a su sys.path temporalmente,

+1

Nota: Es posible que desee agregar el directorio de trabajo actual al comienzo de su ruta con sys.path.insert (0, os.getcwd()) – kkurian

12

Dado que las respuestas anteriores a éste fueron publicadas una opción se puso a disposición para cambiar el comportamiento por defecto (eliminando el directorio actual de la ruta) para incluir el cwd en la ruta.

Así que un simple

(setq python-remove-cwd-from-path nil) 

en su .emacs debe solucionar este problema.

+0

No funcionó para mí – cgl

+0

También puede establecer esta variable en su archivo **. Emacs ** a través de 'Mx customize-variable [RET] python-remove-cwd-from-path [RET]'. – DavidRR

0

mejorar una respuesta ya existente anteriormente: eval esto en su memoria intermedia cero para agregar cwd de nuevo en PYTHONPATH

(defun python-reinstate-current-directory() 
    (python-send-string "sys.path[0:0] = ['']")) 
(add-hook 'inferior-python-mode-hook 'python-reinstate-current-directory) 
0

me ocurrió una solución muy fácil. acaba de agregar a su .emacs la siguiente línea:

(setenv "PYTHONPATH" "/path/to/where/modules/are") 

esta forma se establece el valor de la variable denominada variable de entorno al valor.

Ahora, escribiendo en emacs pitón intérprete ...

>>> import sys 
>>> sys.path 
>>> ['/path/to/where/modules/are', '/usr/share/emacs/23.1/etc' ... ] 

... y la costumbre import s trabajo.

Cuestiones relacionadas