Jak zaimportować moduł, gdy nazwa modułu zawiera myślnik lub myślnik?


195

Chcę zaimportować plik foo-bar.py. To działa:

foobar = __import__("foo-bar")

To nie:

from "foo-bar" import *

Moje pytanie: Czy jest jakiś sposób, aby użyć powyższego formatu, tj. from "foo-bar" import *Zaimportować moduł, który ma -w nim format ?


10
Dlaczego masz moduł z myślnikiem w nazwie?
Matti Virkkunen,

23
Domyślam się, że pierwotnie został napisany jako skrypt, a nie jako moduł.
Michael Hoffman,


@MattiVirkkunen makepy.py z win32com wygeneruje moduł z kreską w nim. szkoda. comtypes rozwiązał ten problem, przekształcając go w podkreślenie
swdev

2
@MattiVirkkunen Myślę, że Python nie powinien ograniczać nazwisk, które mogę podać swoim katalogom. Nie jest to odpowiedzialny za to.
Zelphir Kaltstahl

Odpowiedzi:


117

nie możesz. foo-barnie jest identyfikatorem. zmień nazwę pliku nafoo_bar.py

Edycja: Jeśli importnie jest to Twoim celem (jak w: nie obchodzi Cię, co się stanie sys.modules, nie musisz go importować), po prostu umieszczając wszystkie globale pliku we własnym zakresie, możesz użyćexecfile

# contents of foo-bar.py
baz = 'quux'
>>> execfile('foo-bar.py')
>>> baz
'quux'
>>> 

24
Python 3.x Co nowego w Python 3.0 Usunięto plik wykonywalny (). Zamiast execfile(fn)używać exec(open(fn).read())Istnieje również pakiet importlib.
DevPlayer

106

Jeśli nie możesz zmienić nazwy modułu, aby pasował do konwencji nazewnictwa Python, utwórz nowy moduł, który będzie działał jako pośrednik:

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

 ---- main.py ----
 from foo_proxy import * 

30
Nigdy bym tego nie wdrożył. Ale nie mogę nie dać +1 za czysty blask tego hacka
inspectorG4dget

11
możesz to zrobić bez foo_proxy.pypliku, przypisz wynik __import__(...)do sys.modules['foo_proxy']. Właściwie nie rób tego, to okropny pomysł.
SingleNegationElimination,

3
Fajnie tylko to, czego szukałem. Istnieje przypadek użycia, jeśli używa się bibliotek rodzimych dostarczanych z dystrybucją.
Sven


46

Jeśli nie możesz zmienić nazwy oryginalnego pliku, możesz również użyć dowiązania symbolicznego:

ln -s foo-bar.py foo_bar.py

Następnie możesz po prostu:

from foo_bar import *

2

Jak inni powiedzieli, że nie można używać „-” w nazewnictwie python, istnieje wiele obejść, jedno takie obejście, które byłoby przydatne, gdybyś musiał dodać wiele modułów ze ścieżki używa sys.path

Na przykład, jeśli twoja struktura jest taka:

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

import barfoo
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.