web-dev-qa-db-fra.com

Comment importer un module lorsque le nom du module comporte un tiret ou un tiret?

Je veux importer foo-bar.py. Cela marche:

foobar = __import__("foo-bar")

Cela ne veut pas:

from "foo-bar" import *

Ma question: Existe-t-il un moyen d'utiliser le format ci-dessus, à savoir, from "foo-bar" import * pour importer un module qui a un - dedans?

149
Bala

vous ne pouvez pas. foo-bar n'est pas un identifiant. renommez le fichier en foo_bar.py

Edit: Si import n'est pas votre objectif (comme dans: vous ne vous souciez pas de ce qui se passe avec sys.modules, vous n’avez pas besoin de l’importer lui-même), vous pouvez utiliser execfile pour obtenir tous les globaux du fichier dans votre propre

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

Si vous ne pouvez pas renommer le module afin qu'il corresponde aux conventions de dénomination Python, créez un nouveau module agissant en tant qu'intermédiaire:

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

 ---- main.py ----
 from foo_proxy import * 
87
Raymond Hettinger

Si vous ne pouvez pas renommer le fichier d'origine, vous pouvez également utiliser un lien symbolique:

ln -s foo-bar.py foo_bar.py

Ensuite, vous pouvez simplement:

from foo_bar import *
44
gitaarik

À partir de Python 3.1, vous pouvez utiliser importlib:

import importlib  
foobar = importlib.import_module("foo-bar")

( https://docs.python.org/3/library/importlib.html )

42
Julien

Comme d’autres dit, vous ne pouvez pas utiliser le "-" dans python nommant, il existe de nombreuses solutions de contournement, une solution qui serait utile si vous deviez ajouter plusieurs modules à partir d’un chemin utilise sys.path

Par exemple, si votre structure est comme ceci:

foo-bar
├── barfoo.py
└── __init__.py

import sys
sys.path.append('foo-bar')

import barfoo
1
Reda Drissi