nome python um arquivo igual a um lib

Eu tenho o seguinte script

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

se eu nomear este getopt.py e correr ele não funcionar, pois ele tenta se importar

Existe uma maneira de contornar isso, então eu posso manter este nome de arquivo, mas especificar na importação que eu quero o python padrão lib e não este arquivo?

Solução baseada na resposta da 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 Respostas

Você não deve nomear seus scripts como módulos existentes. Especialmente se padrão.

Dito isto, você pode tocar em sys.path para modificar a ordem de carregamento da 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']

Além disso, você pode evitar a importação completa e fazer isso de maneira diferente, assim:

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
adicionado
Eu usei sys.path.reverse() como eu acho que é melhor, em seguida, removê-lo porque talvez seja necessário importar outro lib que realmente está na pasta atual irá atualizar minha pergunta com a solução que encontrei com base em seus conselhos funciona, mas é mau minha opinião. muito melhor não nomear scripts como libs
adicionado o autor daniels, fonte
@daniels: veja aqui python.org/dev/peps/pep-0328
adicionado o autor André, fonte

Você deve evitar nomear seus arquivos python com nomes de módulos de biblioteca padrão.

4
adicionado
Infelizmente, este conselho é difícil de seguir porque novos nomes de bibliotecas padrão aparecem ... Eu fui mordido uma vez pelo módulo "email" e uma segunda vez pelo módulo "uuid" :-(
adicionado o autor bortzmeyer, fonte
quando desenvolvo algo que faço, mas isso é apenas uma curiosidade. alguém em um fórum teve esse problema e eu era curiosidades se há uma maneira de contornar este
adicionado o autor daniels, fonte
@daniels: existe - use nomes exclusivos.
adicionado o autor S.Lott, fonte
--- O custo de atualizar seu aplicativo para uma nova versão da biblioteca padrão ---
adicionado o autor gimel, fonte
import getopt as bettername

Isso deve permitir que você chame getopt como bettername.

1
adicionado
ainda importa a si mesmo (getopt.py) e não à biblioteca
adicionado o autor daniels, fonte

O Python não oferece uma maneira de qualificar módulos. Você pode conseguir isso removendo a entrada '' do sys.path ou movendo-a para o final. Eu não recomendaria isso.

0
adicionado

Bem, você poderia (re) mover o diretory atual de sys.path, que contém o caminho de busca modificável para as bibliotecas fazerem funcionar, se você realmente precisar disso.

0
adicionado