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 -?


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


@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'
>>> 

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 * 

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 *

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
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.