In Python beginnt das Importieren von Dateinamen mit einer Zahl

82

Grundsätzlich gibt es eine Datei mit dem Namen 8puzzle.pyund ich möchte die Datei in eine andere Datei importieren (im selben Ordner und ich kann den Dateinamen nicht ändern, wenn die Datei bereitgestellt wird). Gibt es überhaupt eine Möglichkeit, dies in Python zu tun? Ich habe es wie gewohnt versucht from 8puzzle import *, es gibt mir einen Fehler.

Fehler ist:

>>> import 8puzzle
  File "<input>", line 1
    import 8puzzle
           ^
SyntaxError: invalid syntax
>>> 
Simon Guo
quelle
11
Warum sagen die Leute "es gibt mir einen Fehler" und posten dann nicht, was der Fehler ist?
John Zwinck
7
@ JohnZwinck Es ist ein Syntaxfehler. Ich vermute, weil "8puzzle" kein gültiger Bezeichner ist (er beginnt mit einer Zahl) und die Syntax für die import-Anweisung dort einen Python-Bezeichner erwartet. Das würde die Antwort ergeben: "Nein, können Sie nicht. Benennen Sie das Modul in etwas um, das mit einem Buchstaben oder einem Unterstrich beginnt."
Millimoose
John machte den guten Punkt, ich werde daran denken. Und danke Abhijeet füge die Fehlermeldung für mich hinzu. Vielen Dank.
Simon Guo
1
Umbenennen 8puzzle.pyin puzzle8.pyund verwenden import puzzle8.
Bakuriu

Antworten:

94

Du könntest es tun

puzzle = __import__('8puzzle')

Sehr interessantes Problem. Ich werde daran denken, nichts mit einer Nummer zu benennen.

Wenn Sie möchten, import *sollten Sie diese Frage und Antwort prüfen .

Yuji 'Tomita' Tomita
quelle
1
funktioniert super! Vielen Dank. Ja, ich würde es nicht mit einer Nummer beginnen, aber es ist eine Handout-Datei für die Kurszuweisung, daher kann ich den Namen nicht ändern. Aber es scheint keine Rolle zu spielen, da wir bereits die Lösung dafür haben. Danke noch einmal.
Simon Guo
3
Hilf mit, die Welt oder zumindest deine Klassenkameraden zu retten. Wenn Sie einen unmöglichen Import erhalten, machen Sie den Ausbilder darauf aufmerksam. Ja, manchmal hassen sie es, falsch zu liegen, aber wenn Sie dieses Problem haben, sind es auch alle anderen, und obwohl diese Antwort funktioniert, ist sie nicht die richtige Lösung (es sei denn, die Klasse lautet "Obfuscated Python 101").
msw
1
Ein besserer Weg (mindestens mit Python 2.7) ist die Verwendung des Moduls 'importlib': puzzle = importlib.import_module ('8puzzle')
Cédric
3
Es gibt tatsächlich einen guten Anwendungsfall dafür - als Teil des Kompilierungs- / Produktionsprozesses ist es am einfachsten, Python-Module miteinander zu verketten, wenn sie in lexigraphischer Form benannt werden (im Allgemeinen spielt es keine Rolle, aber Konstanten und Importe oben, wenn Name 'unten, daher können einige Module, die mit' 0 'beginnen, nützlich sein.) Auch nützlich beim Debuggen eines solch ungewöhnlichen Verzeichnislayouts, wenn es mit inotify oder watch kombiniert wird, wie zum Beispiel: watch -n .1' cat * | python ', das Ihre Python-App jede Zehntelsekunde (oder zumindest so schnell wie möglich) lädt, oder: cat $ (find. -name "* .py") | Python
fatal_error
1
Spät zur Party, aber ein anderer Anwendungsfall ist der Import aus alembischen Migrationen, da alle mit zufälligen Hashes beginnen
kevlarr
35

Die obigen Antworten sind korrekt, aber im Moment wird empfohlen, die import_moduleFunktion zu verwenden :

importlib.import_module(name, package=None)
Importieren Sie ein Modul. Das Argument name gibt an, welches Modul absolut oder relativ importiert werden soll (z . B. entweder pkg.mododer ..mod). Wenn der Name relativ angegeben wird, muss das Paketargument auf den Namen des Pakets gesetzt werden, das als Anker für die Auflösung des Paketnamens dienen soll (z . B. import_module('..mod', 'pkg.subpkg')wird importiert pkg.mod).

Die Funktion import_module () dient als vereinfachender Wrapper importlib.__import__(). Dies bedeutet, dass alle Semantiken der Funktion abgeleitet sind importlib.__import__(). Der wichtigste Unterschied zwischen diesen beiden Funktionen besteht darin, dass import_module()das angegebene Paket oder Modul (z. B. pkg.mod) zurückgegeben wird, während __import__()das Paket oder Modul der obersten Ebene (z pkg. B. ) zurückgegeben wird.

Wenn Sie ein Modul dynamisch importieren, das seit Beginn der Ausführung durch den Interpreter erstellt wurde (z. B. eine Python-Quelldatei erstellt), müssen Sie möglicherweise aufrufen invalidate_caches(), damit das neue Modul vom Importsystem erkannt wird.

__import__ wird jetzt nicht empfohlen.

importlib.__import__(name, globals=None, locals=None, fromlist=(), level=0)
Eine Implementierung der eingebauten __import__()Funktion.

Hinweis Der programmatische Import von Modulen sollte import_module()anstelle dieser Funktion verwendet werden.

laike9m
quelle
Es funktioniert dank, aber es funktioniert nicht, eine Funktion oder Variable in eine dieser Dateien zu importieren, beginnend mit einer Zahl. Wenn ich das tue an_imported_file = importlib.import_module('13_file'), kann ich es nicht tun from an_imported_file import var_x. Gibt es etwas, das getan werden kann, um dies zu erreichen?
Martin
/usr/local/bin/python3.7 "/Users/constan/Desktop/2_COData/1_PYTHON /CODEX/13_Spacy/children.py" Traceback (most recent call last): File "/Users/constan/Desktop/2_COData/1_PYTHON /CODEX/13_Spacy/children.py", line 7, in <module> from an_imported_file import var_x ModuleNotFoundError: No module named 'an_imported_file'
Martin
Außerdem ist die Zeile "from an_imported_file import var_x" in Pycharm rot unterstrichen ...
Martin
Es tut mir nicht leid. Mein allgemeiner Rat ist, dies zu vermeiden.
laike9m
0

Verwenden Sie die .pyErweiterung nicht für Ihre Importe.

Funktioniert from 8puzzle import *?

Für das, was es wert ist, from x import *ist es kein bevorzugtes Python-Muster, da es den Namespace dieses Moduls in Ihren aktuellen Kontext einfügt.

Versuchen Sie im Allgemeinen, die gewünschten Elemente aus diesem Modul zu importieren. Jedes globale aus dem anderen Modul kann importiert werden.

zB wenn du hast 8puzzle.fookannst du `aus 8puzzle importieren

Bearbeiten:

Obwohl meine .pyNachricht korrekt ist, reicht sie nicht aus.

Der __import__('8puzzle')Vorschlag des anderen Posters ist richtig. Ich empfehle jedoch dringend, dieses Muster zu vermeiden .

Zum einen ist eine interne, private Python-Methode reserviert. Sie brechen im Grunde die grundlegenden Annahmen darüber, was es bedeutet, ein Modul importieren zu können. Wenn Sie die Datei einfach in etwas anderes umbenennen puzzle8, wird dies behoben.

Dies wird die Hölle von erfahrenen Python-Programmierern frustrieren, die erwarten, zu wissen, was Ihre Importe an der Spitze sind, und erwarten, dass der Code PEP8 entspricht (versucht) .

mvanveen
quelle
1
Entschuldigung für die Verwirrung. Ich habe from 8puzzle import *meine ursprüngliche Frage bearbeitet. Und es funktioniert nicht, wie Mvanveen sagte.
Simon Guo
Das ist mein schlechtes Ich habe vergessen, dass Modul-Dateinamen nicht mit einer Nummer beginnen können. Ich habe eine Bearbeitung gepostet.
Mvanveen