Wie importiere ich ein Modul, wenn der Modulname einen Bindestrich oder Bindestrich enthält?

193

Ich möchte foo-bar.py importieren. Das funktioniert:

foobar = __import__("foo-bar")

Das tut nicht:

from "foo-bar" import *

Meine Frage: Gibt es eine Möglichkeit, das obige Format zu verwenden, dh from "foo-bar" import *ein Modul zu importieren, das ein enthält -?

Bala
quelle
10
Warum haben Sie ein Modul mit einem Bindestrich im Namen?
Matti Virkkunen
22
Ich vermute, es wurde ursprünglich als Skript und nicht als Modul geschrieben.
Michael Hoffman
1
Mögliches Duplikat des Python-Moduls mit einem Bindestrich oder Bindestrich (-) im Namen
Piotr Dobrogost
@MattiVirkkunen makepy.py von win32com generiert ein Modul mit einem Bindestrich. schade. comtypes löste dies, indem es es in Unterstrich
umwandelte
2
@MattiVirkkunen Ich denke, Python sollte die Namen, die ich meinen Verzeichnissen geben kann, nicht einschränken. Es liegt nicht in seiner Verantwortung, dies zu tun.
Zelphir Kaltstahl

Antworten:

115

du kannst nicht. foo-barist keine Kennung. Benennen Sie die Datei in umfoo_bar.py

Bearbeiten: Wenn dies importnicht Ihr Ziel ist (wie in: Es ist Ihnen egal, was passiert sys.modules, Sie brauchen es nicht, um sich selbst zu importieren), können Sie nur alle Globals der Datei in Ihren eigenen Bereich bringenexecfile

# contents of foo-bar.py
baz = 'quux'
>>> execfile('foo-bar.py')
>>> baz
'quux'
>>> 
SingleNegationElimination
quelle
24
Python 3.x Was ist neu in Python 3.0 ? Execfile () wurde entfernt. Anstelle von execfile(fn)Verwendung exec(open(fn).read())gibt es auch Paket importlib.
DevPlayer
103

Wenn Sie das Modul nicht entsprechend den Python-Namenskonventionen umbenennen können, erstellen Sie ein neues Modul als Vermittler:

 ---- foo_proxy.py ----
 tmp = __import__('foo-bar')
 globals().update(vars(tmp))

 ---- main.py ----
 from foo_proxy import * 
Raymond Hettinger
quelle
28
Ich würde das niemals umsetzen. Aber ich kann nicht +1 für die Brillanz dieses Hack geben
inspectorG4dget
11
Sie könnte dies tatsächlich tun , ohne dass die foo_proxy.pyDatei, die Ausgabe zuweisen __import__(...)zu sys.modules['foo_proxy']. Tu das eigentlich nicht, es ist eine schreckliche Idee.
SingleNegationElimination
3
Cool genau das, wonach ich gesucht habe. Es gibt einen Anwendungsfall, wenn man native Bibliotheken verwendet, die mit einer Distribution geliefert werden.
Sven
45

Wenn Sie die Originaldatei nicht umbenennen können, können Sie auch einen Symlink verwenden:

ln -s foo-bar.py foo_bar.py

Dann können Sie einfach:

from foo_bar import *
Gitaarik
quelle
2

Wie andere bereits sagten, können Sie das "-" bei der Python-Benennung nicht verwenden. Es gibt viele Problemumgehungen. Eine solche Problemumgehung, die nützlich wäre, wenn Sie mehrere Module aus einem Pfad hinzufügen müssten, wird verwendet sys.path

Zum Beispiel, wenn Ihre Struktur so ist:

foo-bar
├── barfoo.py
└── __init__.py
import sys
sys.path.append('foo-bar')

import barfoo
Reda Drissi
quelle