Come importare il modulo quando il nome del modulo ha un trattino '-' o un trattino?


195

Voglio importare foo-bar.py. Questo funziona:

foobar = __import__("foo-bar")

Questo non:

from "foo-bar" import *

La mia domanda: c'è un modo in cui posso usare il formato sopra, from "foo-bar" import *ad esempio, per importare un modulo che contiene un -?


10
Perché hai un modulo con un trattino nel suo nome?
Matti Virkkunen,

23
Immagino che sia stato originariamente scritto come una sceneggiatura piuttosto che come un modulo.
Michael Hoffman,


@MattiVirkkunen makepy.py di win32com genererà il modulo con un trattino al suo interno. peccato. comtypes ha risolto questo problema convertendolo in trattino basso
swdev,

2
@MattiVirkkunen Penso che Python non dovrebbe limitare i nomi che posso dare alle mie directory. Non è sua responsabilità farlo.
Zelphir Kaltstahl,

Risposte:


117

non puoi. foo-barnon è un identificatore. rinominare il file infoo_bar.py

Modifica: se importnon è il tuo obiettivo (come in: non ti interessa cosa succede sys.modules, non ti serve per importare se stesso), semplicemente portando tutti i globi del file nel tuo ambito, puoi usareexecfile

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

24
Python 3.x Novità di Python 3.0 Rimosso execfile (). Invece di execfile(fn)usare exec(open(fn).read())C'è anche il pacchetto importlib.
DevPlayer

107

Se non riesci a rinominare il modulo in modo che corrisponda alle convenzioni di denominazione di Python, crea un nuovo modulo che funga da intermediario:

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

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

30
Non lo implementerei mai. Ma non posso non dare +1 per la geniale brillantezza di questo hack
inspectorG4dget il

11
potresti effettivamente farlo senza il foo_proxy.pyfile, assegnare l'output di __import__(...)a sys.modules['foo_proxy']. In realtà, non farlo, è un'idea terribile.
SingleNegationElimination

3
Raffreddare proprio quello che stavo cercando. C'è un caso d'uso, se si usano librerie native che vengono spedite con una distribuzione.
Sven


46

Se non riesci a rinominare il file originale, puoi anche utilizzare un link simbolico:

ln -s foo-bar.py foo_bar.py

Quindi puoi semplicemente:

from foo_bar import *

2

Come altri hanno detto che non puoi usare il "-" nella denominazione di Python, ci sono molte soluzioni alternative, una di queste soluzioni che sarebbe utile se dovessi aggiungere più moduli da un percorso sta usando sys.path

Ad esempio se la tua struttura è così:

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

import barfoo
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.