Python benennt eine Datei wie eine Lib

Ich habe das folgende Skript

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

Wenn ich dieses getopt.py nennen und ausführen, funktioniert es nicht, da es versucht, sich selbst zu importieren

Gibt es einen Weg um dies, so kann ich diesen Dateinamen beibehalten, aber beim Import angeben, dass ich die Standard-Python-Lib und nicht diese Datei wollen?

Lösung basierend auf Vinkos Antwort:

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 Antworten

Sie sollten Ihre Skripts nicht wie vorhandene Module benennen. Besonders wenn es Standard ist.

Sie können jedoch sys.path berühren, um die Ladereihenfolge der Bibliothek zu ändern

~# 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']

Darüber hinaus möchten Sie möglicherweise den vollständigen Import vermeiden und es anders machen, wie folgt:

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
hinzugefügt
Ich benutze sys.path.reverse (), weil ich denke, es ist besser, als es zu entfernen, weil vielleicht jemand eine andere lib importieren muss, die tatsächlich im aktuellen Ordner ist, wird meine Frage mit der Lösung aktualisieren, die ich gefunden habe meine Meinung. viel besser, keine Skripte wie libs zu benennen
hinzugefügt der Autor daniels, Quelle
@daniels: siehe hier python.org/dev/peps/pep-0328
hinzugefügt der Autor André, Quelle

Sie sollten vermeiden, Ihre Python-Dateien mit Standard-Bibliotheksmodulnamen zu benennen.

4
hinzugefügt
Leider ist dieser Ratschlag schwer zu befolgen, da neue Standard-Bibliotheksnamen erscheinen ... Ich wurde einmal von dem "E-Mail" Modul und ein zweites Mal von dem "Uuid" Modul gebissen :-(
hinzugefügt der Autor bortzmeyer, Quelle
wenn ich etwas entwickele, ist das nur eine Kuriosität. Jemand in einem Forum hatte dieses Problem und ich war neugierig, wenn es einen Weg gibt
hinzugefügt der Autor daniels, Quelle
@daniels: Es gibt - eindeutige Namen verwenden.
hinzugefügt der Autor S.Lott, Quelle
--- Die Kosten für die Aktualisierung Ihrer App auf eine neue Standard-Bibliotheksversion ---
hinzugefügt der Autor gimel, Quelle
import getopt as bettername

Dies sollte Ihnen erlauben, getopt als Bettername aufzurufen.

1
hinzugefügt
Es importiert sich selbst (getopt.py) und nicht die Bibliothek
hinzugefügt der Autor daniels, Quelle

Python gibt Ihnen keine Möglichkeit, Module zu qualifizieren. Sie können dies möglicherweise erreichen, indem Sie den Eintrag 'sys.path' entfernen oder ihn bis zum Ende verschieben. Ich würde es nicht empfehlen.

0
hinzugefügt

Nun, Sie könnten das aktuelle Verzeichnis von sys.path (neu) verschieben, das den veränderbaren Suchpfad für Bibliotheken enthält, damit es funktioniert, wenn Sie das wirklich brauchen.

0
hinzugefügt