Importation arbitraire python fichier source. (Python 3.3,+)
Comment puis-je importer un python arbitraire fichier source (dont le nom de fichier peut contenir n'importe quel caractère, et ne se termine toujours par .py
) dans Python 3.3,+?
J'ai utilisé imp.load_module
comme suit:
>>> import imp
>>> path = '/tmp/a-b.txt'
>>> with open(path, 'U') as f:
... mod = imp.load_module('a_b', f, path, ('.py', 'U', imp.PY_SOURCE))
...
>>> mod
<module 'a_b' from '/tmp/a-b.txt'>
Il travaille toujours en Python 3.3, mais selon imp.load_module
de la documentation, il est obsolète:
Obsolète depuis la version 3.3: Inutiles comme les chargeurs devraient être utilisés pour
les modules de charge et find_module() est obsolète.
et imp
documentation du module recommande d'utiliser importlib
:
Note les Nouveaux programmes devraient utiliser importlib plutôt que de ce module.
Quelle est la bonne façon de charger un python arbitraire fichier source en Python 3.3+ sans l'aide de l'obsolète imp.load_module
fonction?
- Puis-je vous demander pourquoi vous faites cela? Je suis le responsable de importlib et j'ai essayé d'obtenir des réponses de gens pourquoi ils utilisent
imp.load_module()
sur une droite instruction import. Attendez-vous à importer le module par le nom plus tard (p. ex.import a_b
)? Craignez-vous que tous les importateurs ne sont pas utilisés dans cette approche? Pensez-vous que le module complet (par exemple, définir__name__
et__loader__
)? - Un programme tiers régulièrement (une fois par heure) modifier un fichier texte qui contient des instructions python (principalement
THIS='blah'
comme des lignes). Le nom de fichier n'est pas terminé avec.py
. Mon programme de lecture de fichier. - Je ne suis pas au courant de la coutume, les importateurs. Je n'aime pas le module complet.
- OIE à l'aide de Python comme vraiment simple structure de données de format. Merci pour l'info!
- Pourriez-vous expliquer pourquoi?
- Je viens de tomber sur un cas où j'ai besoin d'importer du code Python dans un répertoire qui a été nommé comme un numéro de version (par exemple, "v1.0.2"). Tout est possible, il serait malvenu de renommer le répertoire. Je me suis retrouvé à l'aide de stefan-scherfke la solution ci-dessous.
- Connexes: stackoverflow.com/questions/2601047/...
Vous devez vous connecter pour publier un commentaire.
Trouvé une solution de
importlib
de test de code.À l'aide de importlib.de la machinerie.SourceFileLoader:
NOTE: fonctionne uniquement en Python 3.3,+.
Mise à JOUR
Chargeur.load_module
est obsolète depuis Python 3.4. UtilisationChargeur.exec_module
à la place:load_module
ignore viawarnings.catch_warnings
. Si vous utilisez à la placemod = imp.load_source('a_b', '/tmp/a-b.txt')
, il soulève l'avertissement suivant (utiliser-Wall
):DeprecationWarning: imp.load_source() is deprecated; use importlib.machinery.SourceFileLoader(name, pathname).load_module() instead
.SourceFileLoader
ne comprend pur Python modules de code source. Pour le chargement des modules d'extension (.donc / .les fichiers dll) avec l'arbitraire d'un suffixe, le frère de la classeExtensionFileLoader
est le chemin à parcourir 🙂Version plus courte de @falsetru 's solution:
Je l'ai testé avec Python 3.5 et 3.6.
Selon les commentaires, il ne fonctionne pas avec l'arbitraire des extensions de fichier.
importlib.util.spec_from_file_location(..)
retourneNone
pour moi, provoquant une exception pour la suiteimportlib.util.module_from_spec(..)
appel. (Voir i.imgur.com/ZjyFhif.png)importlib.util.spec_from_file_location
œuvres connu extensions de nom de fichier (.py
,.so
, ..), mais pas pour d'autres (.txt
...)Similaire à @falsetru mais pour Python 3.5+ et de la comptabilité pour ce le
importlib
doc unis sur l'utilisation deimportlib.util.module_from_spec
surtypes.ModuleType
:Nous sommes en mesure d'importer n'importe quel fichier avec
importlib
seul en modifiant laimportlib.machinery.SOURCE_SUFFIXES
liste.importlib.machinery.EXTENSION_SUFFIXES.append('')
fait encoreimportlib.util.spec_from_file_location
retour Aucun.importlib.util.spec_from_file_location
doivent encore travailler avec des extensions si vous spécifiez un chargeur