nombre python un archivo igual que una lib

tengo el siguiente script

import getopt, sys
opts, args = getopt.getopt(sys.argv[1:], "h:s")
for key,value in opts:
    print key, "=>", value

si le pongo este nombre a getopt.py y lo ejecuto, no funciona, ya que intenta importarlo

¿Hay alguna forma de evitar esto, así que puedo mantener este nombre de archivo pero especificar al importar que quiero la lib de Python estándar y no este archivo?

Solución basada en la respuesta de Vinko:

import sys
sys.path.reverse()
from getopt import getopt

opts, args = getopt(sys.argv[1:], "h:s")

for key,value in opts:
    print key, "=>", value
2

5 Respuestas

No debe nombrar sus scripts como los módulos existentes. Especialmente si es estándar.

Dicho esto, puede tocar sys.path para modificar el orden de carga de la biblioteca

~# cat getopt.py
print "HI"
~# python
Python 2.5.2 (r252:60911, Jul 31 2008, 17:28:52)
[GCC 4.2.3 (Ubuntu 4.2.3-2ubuntu7)] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import sys
>>> import getopt
HI

~# python
Python 2.5.2 (r252:60911, Jul 31 2008, 17:28:52)
[GCC 4.2.3 (Ubuntu 4.2.3-2ubuntu7)] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import sys
>>> sys.path.remove('')
>>> import getopt
>>> dir(getopt)
['GetoptError', '__all__', '__builtins__', '__doc__', '__file__', '__name__', 'do_longs', 'do_shorts', 'error', 'getopt', 'gnu_getopt', 'long_has_args', 'os', 'short_has_arg']

Además, es posible que desee evitar la importación completa y hacerlo de manera diferente, así:

import sys
sys.path.remove('')
from getopt import getopt
sys.path.insert(0,'')
opts, args = getopt(sys.argv[1:], "h:s")
for key,value in opts:
    print key, "=>", value
7
agregado
utilicé sys.path.reverse() porque creo que es mejor que eliminarlo porque tal vez sea necesario importar otra lib que en realidad está en la carpeta actual. Actualizaré mi pregunta con la solución que encontré basada en sus consejos, pero funciona mal. mi opinión. mucho mejor no nombrar guiones como libs
agregado el autor daniels, fuente
@daniels: mira aquí python.org/dev/peps/pep-0328
agregado el autor André, fuente

Debería evitar nombrar sus archivos python con nombres de módulo de biblioteca estándar.

4
agregado
Desafortunadamente, este consejo es difícil de seguir porque aparecen nuevos nombres de biblioteca estándar ... Fui mordido una vez por el módulo "correo electrónico" y una segunda vez por el módulo "uuid" :-(
agregado el autor bortzmeyer, fuente
al desarrollar algo que hago, pero esto es solo una curiosidad. alguien en un foro tuvo este problema y yo era curioso si hay una forma de evitar esto
agregado el autor daniels, fuente
@daniels: hay - use nombres únicos.
agregado el autor S.Lott, fuente
--- El costo de actualizar su aplicación a una nueva versión estándar de la biblioteca ---
agregado el autor gimel, fuente
import getopt as bettername

Esto debería permitirle llamar a getopt como bettername.

1
agregado
todavía se importa a sí mismo (getopt.py) y no a la biblioteca
agregado el autor daniels, fuente

Python no le da una forma de calificar los módulos. Es posible que pueda lograr esto eliminando la entrada '' de sys.path o moviéndola hasta el final. No lo recomendaría.

0
agregado

Bueno, podría (re) mover el directorio actual de sys.path, que contiene la ruta de búsqueda modificable para que las bibliotecas lo hagan funcionar, si realmente lo necesita.

0
agregado