2009-02-26 12 views
5

¿Solo es posible si cambio el nombre del archivo? ¿O hay una variable __module__ en el archivo para definir cuál es su nombre?¿Cómo cambiar un nombre de módulo de Python?

+0

¿Cuál es el problema con el cambio de nombre del archivo? ¿Por qué el cambio de nombre no funciona? –

+0

En realidad, era solo pereza ... No quería eliminar y volver a agregar el archivo en Launchpad. – Rodrigo

Respuesta

8

Sí, debe cambiar el nombre del archivo. Lo mejor sería después de haber hecho eso para eliminar los archivos compilados oldname.pyc y oldname.pyo (si los hubiera) de su sistema, de lo contrario, el módulo también será importable bajo el nombre anterior.

0

Cada clase tiene una propiedad __module__, aunque creo que cambiar esto no cambiará el espacio de nombres de la clase.

Si es posible, probablemente sea necesario usar setattr para insertar los métodos o clases en el módulo deseado, aunque se corre el riesgo de que el código sea muy confuso para sus futuros compañeros.

Su mejor opción es cambiar el nombre del archivo.

0

¿Dónde le gustaría tener esta variable __module__, por lo que su secuencia de comandos original sabe qué importar? Los módulos se reconocen por nombres de archivo y se buscan en las rutas definidas en la variable sys.path.

Por lo tanto, debe cambiar el nombre del archivo y luego eliminar el oldname.pyc, solo para asegurarse de que todo funcione correctamente.

17

Si realmente desea importar el archivo 'oldname.py' con la afirmación 'importación newname', hay un truco que hace posible: el módulo de importación algún lugar con el nombre antiguo, y luego inyectarla en sys.modules con el nuevo nombre. Las declaraciones de importación posteriores también lo encontrarán bajo el nuevo nombre. Ejemplo de código:

# this is in file 'oldname.py' 
...module code... 

Uso:

# inject the 'oldname' module with a new name 
import oldname 
import sys 
sys.modules['newname'] = oldname 

Ahora puede hacerlo en todas partes con su módulo import newname.

+0

No puedo pensar en una situación en la que me gustaría hacer eso, pero es genial que puedas :) – technomalogical

+1

Una situación: un proyecto donde quieres compatibilidad con python 2.6 y 2.7, pero quieres usar algunos nuevos 2.7 funcionalidad unittest Este truco nos permite tener el código simplemente use 'import unittest 'mientras aún usamos la nueva funcionalidad, por lo que no tuvimos que modificar un montón de sentencias de importación cada vez que cambiamos la versión de Python. – Tobi

11

Puede cambiar el nombre usado para un módulo cuando se importan utilizando como:

import foo as bar 
print bar.baz 
1

Al hacer import module_name el intérprete de Python busca un archivo module_name.extension en PYTHONPATH. Entonces no hay que cambiar ese nombre sin cambiar el nombre del archivo. Pero por supuesto que puede hacer:

import module_name as new_module_name 

o incluso

import module_name.submodule.subsubmodule as short_name 

útil, por ejemplo. para escribir el código DB

import sqlite3 as sql 
sql.whatever.. 

Y luego, para cambiar por ejemplo. sqlite3 a pysqlite acaba de cambiar la línea de importación

0

Tuve un problema como este con bsddb. Me vi obligado a instalar el módulo bsddb3 pero cientos de scripts importaron bsddb. En lugar de cambiar la importación en todos ellos, extraje el huevo bsddb3 y creé un enlace blando en el directorio site-packages para que tanto "bsddb" como "bsddb3" fueran uno igual a python.

Cuestiones relacionadas