Importer un module python sans le .py extension
J'ai un fichier appelé foobar (sans .py extension). Dans le même répertoire que j'ai un autre fichier python qui essaie de l'importer:
import foobar
Mais cela ne fonctionne que si je renomme le fichier à foobar.py. Est-il possible d'importer un module python qui n'ont pas l' .py extension?
Mise à jour: le fichier n'a pas d'extension, car je l'utilise aussi comme un script autonome, et je ne veux pas le type de l' .py extension pour l'exécuter.
Update2: je vais aller pour le lien de la solution mentionnée ci-dessous.
- Je suis intrigué. Pourquoi avez-vous un fichier python sans
py
extension? - Parfois, il est agréable à utiliser python pour les fichiers de configuration d'extension .conf) ou pour désigner un type spécial de fichier. Dans mon cas, ce serait plus qu'une commodité pour un Administrateur.
- J'ai un fichier de configuration qui est utilisé à la fois comme un fichier python et comme un script bash. Je lui ai donné un
pysh
extension... - Si c'est un problème de configuration de choses, je vous recommande d'utiliser
ConfigParser
. wiki.python.org/moin/ConfigParserExamples - Une des raisons est des scripts python avec .cgi extensions au lieu de .py extension
Vous devez vous connecter pour publier un commentaire.
Vous pouvez utiliser le
imp.load_source
fonction (à partir de laimp
module), pour charger un module dynamique à partir d'un chemin du système de fichiers.Ce DONC la discussion montre également quelques options intéressantes.
'foobar'
si elle est affectée à la valeur de retour?__name__
bien; normalement c'est déterminé à partir du nom de fichier, mais puisque vous êtes en utilisant un non-standard de nom de fichier (qui pourrait même ne pas contenir de python valide identifiant à tous), vous devez spécifier le nom du module. Le nom de la variable dans lequel vous stocker une référence à l'objet module est hors de propos, comme si vousimport foo.bar as baz
le module référencé par la variablebaz
aura toujours son origine__name__
.Comme d'autres l'ont mentionné, vous pourriez utiliser imp.load_source, mais il permet de rendre votre code plus difficile à lire. Je voudrais vraiment que vous le recommandons si vous avez besoin d'importer des modules dont les noms ou les chemins d'accès ne sont pas connus jusqu'à ce moment de l'exécution.
Quelle est votre raison de ne pas vouloir utiliser le .py extension? Le cas le plus fréquent pour ne pas vouloir utiliser le .py extension, c'est parce que le script python est également exécuter un exécutable, mais vous voulez encore d'autres modules afin de pouvoir l'importer. Si c'est le cas, il pourrait être avantageux de déplacer les fonctionnalités d'un .py fichier avec un nom similaire, et ensuite utiliser
foobar
comme un wrapper.bin/
répertoire, le programme ne fonctionne pas lorsqu'il est exécuté à partir du chemin d'accès.imp.load_source(module_name, path)
devrait le faire, ou vous pouvez faire le plus de commentairesimp.load_module(module_name, file_handle, ...)
itinéraire si vous avez un descripteur de fichier à la placeVoici une solution pour Python 3.4+:
À l'aide de
spec_from_loader
et spécifiant explicitement unSourceFileLoader
force la machines pour charger le fichier en tant que source, sans essayer de comprendre le type de fichier de l'extension. Cela signifie que vous pouvez charger le fichier, même si elle n'est pas répertoriée dansimportlib.de la machinerie.SOURCE_SUFFIXES
.Si vous voulez garder l'importation du fichier par son nom après la première charge, ajouter le module à
sys.modules
:foobar = importlib.nice_import('foobar')
helper désespérément./some/arbitrary/file.weird_extension
qualifie de "gentil". Cela étant dit, j'ai commencé à utiliser le code python pour tous mes fichiers de configuration une fois que j'ai découvert cela. C'est tellement pratique.Si vous installez le script avec le gestionnaire de package (deb ou équivalent) une autre option serait d'utiliser setuptools:
https://pythonhosted.org/setuptools/setuptools.html#automatic-script-creation
importlib
fonction d'assistanceVoici une commode, prêt-à-utilisation de l'aide pour remplacer
imp
, avec un exemple, basé sur ce qui a été mentionné à: https://stackoverflow.com/a/43602645/895245main.py
pas-main
Exécuter:
De sortie:
- Je remplacer
-
avec_
parce que mon importables Python exécutables sans extension, ont des traits d'union. Ce n'est pas obligatoire, mais donne de meilleurs noms de module.Ce modèle est également mentionné dans les docs à: https://docs.python.org/3.7/library/importlib.html#importing-a-source-file-directly
J'ai fini de déménager, car après la mise à jour de Python 3.7,
import imp
imprime:et je ne sais pas comment faire pour désactiver cette fonction.
Testé en Python 3.7.3.