129 votes

En python, comment importer un nom de fichier commençant par un chiffre ?

En fait, il y a un fichier appelé 8puzzle.py et je veux importer le fichier dans un autre fichier (dans le même dossier et je ne peux pas changer le nom du fichier car le fichier est fourni). Existe-t-il un moyen de faire cela en Python ? J'ai essayé la méthode habituelle from 8puzzle import * il me donne une erreur.

L'erreur est :

>>> import 8puzzle
  File "<input>", line 1
    import 8puzzle
           ^
SyntaxError: invalid syntax
>>>

17 votes

Pourquoi les gens disent-ils "cela me donne [une] erreur" et n'indiquent pas quelle est cette erreur ?

8 votes

@JohnZwinck C'est une erreur de syntaxe. Je suppose que c'est parce que "8puzzle" n'est pas un identifiant valide (il commence par un chiffre), et la syntaxe de l'instruction d'importation attend un identifiant Python à cet endroit. Ce qui rendrait la réponse "Non, vous ne pouvez pas. Renommez le module en quelque chose qui commence par une lettre ou un trait de soulignement."

0 votes

John a fait une bonne remarque, que je garderai à l'esprit. Et merci Abhijeet d'ajouter le message d'erreur pour moi. Merci.

148voto

Yuji 'Tomita' Tomita Points 46106

Vous pourriez faire

puzzle = __import__('8puzzle')

Un problème très intéressant. Je me souviendrai de ne pas nommer quoi que ce soit avec un numéro.

Si vous souhaitez import * -- vous devriez consultez cette question et cette réponse .

1 votes

Cela fonctionne très bien ! Merci. Oui, je ne voudrais pas le nommer en commençant par un numéro, mais il s'agit d'un dossier de cours, donc je ne peux pas changer le nom. Mais il semble que cela n'a pas d'importance puisque nous avons déjà la solution pour cela. Merci encore.

10 votes

Aidez à sauver le monde, ou du moins vos camarades de classe. Si on vous remet une importation impossible, portez-la à l'attention de l'instructeur. Oui, parfois ils détestent avoir tort, mais si vous avez ce problème, tout le monde l'a aussi et même si cette réponse fonctionne, ce n'est pas la bonne solution (à moins que le cours ne soit "Obfuscated Python 101").

4 votes

Une meilleure méthode (avec python 2.7 au moins) consiste à utiliser le module 'importlib' : puzzle = importlib.import_module('8puzzle')

50voto

laike9m Points 1215

Les réponses ci-dessus sont correctes, mais pour l'instant, il est recommandé d'utiliser la méthode suivante import_module fonction :

importlib.import_module(name, package=None)
Importez un module. L'argument name spécifie le module à importer en termes absolus ou relatifs (par ex. (par exemple, soit pkg.mod o ..mod ). Si le nom est spécifié en termes relatifs l'argument package doit être défini comme le nom du paquet qui doit servir d'ancrage pour résoudre le nom du paquet. paquet qui doit servir d'ancrage pour la résolution du nom de paquet (par exemple import_module('..mod', 'pkg.subpkg') importera pkg.mod ).

La fonction import_module() agit comme une enveloppe simplifiée autour de la fonction importlib.__import__() . Cela signifie que toute la sémantique de la fonction est dérivée de importlib.__import__() . La différence la plus importante entre ces deux fonctions est que import_module() retourne le paquet ou module spécifié (par exemple pkg.mod ), tandis que __import__() renvoie le paquet ou le module de premier niveau (par ex. pkg ).

Si vous importez dynamiquement un module créé depuis le début de l'exécution de l'interpréteur (par ex. l'interpréteur a commencé l'exécution (par exemple, la création d'un fichier source Python), vous pouvez pouvez avoir besoin d'appeler invalidate_caches() pour que le nouveau module soit remarqué par le système d'importation.

__import__ n'est pas recommandé maintenant.

importlib.__import__(name, globals=None, locals=None, fromlist=(), level=0)
Une implémentation de la fonction intégrée __import__() función.

Note L'importation programmée de modules doit utiliser import_module() au lieu de cette fonction.

5voto

marie Points 37

La structure du répertoire des fichiers est la suivante :

 daily
   -- 20210504
         permutations.py
         __init__.py
   __init__.py

Vous pouvez importer le permutations module par __import__ o importlib.import_module .

La documentation officielle recommande d'utiliser importlib.import_module .

importar (name, globals=None, locals=None, fromlist=(), level=0) -> module

Importer un module. Comme cette fonction est destinée à être utilisée par l'interpréteur Python et non à un usage général, il est préférable de useimportlib.import_module() pour importer un module de manière programmatique.

Quelle est la différence ?

Si elle est mise en œuvre en utilisant __import__ . Par exemple :

res = __import__('daily.20210504.permutations')

Le résultat de res est le module quotidien. daily module

Donc, si vous voulez obtenir le permutations vous devez fournir le paramètre fromlist, qui s'écrit comme suit.

res = __import__('daily.20210504.permutations', fromlist=('daily.20210504'))

Le résultat de res peut être vu maintenant comme enter image description here C'est le bon résultat.

Et si j'utilise importlib.import_module ?

res = importlib.import_module('daily.20210504.permutations')

cela vous permet d'obtenir le permutations directement.

-1voto

mvanveen Points 2067

N'utilisez pas le .py dans vos importations.

Fait from 8puzzle import * travail ?

Pour ce que ça vaut, from x import * n'est pas un modèle Python privilégié, car il fait déborder l'espace de noms de ce module dans votre contexte actuel.

En général, essayez d'importer les choses que vous voulez spécifiquement de ce module. Tout élément global de l'autre module peut être importé.

Par exemple, si vous avez 8puzzle.foo vous pourriez faire `from 8puzzle import

Editar:

Alors que mon .py est correct, il n'est pas suffisant.

L'autre affiche __import__('8puzzle') La suggestion est correcte. Cependant, Je recommande fortement d'éviter ce modèle .

D'une part, elle est réservée à une méthode Python interne et privée. Vous brisez les hypothèses fondamentales de ce que signifie la possibilité d'importer un module. Il suffit de renommer le fichier en quelque chose d'autre, comme puzzle8 va y remédier.

Cela va frustrer les programmeurs Python expérimentés qui s'attendent à savoir quels sont vos imports en haut de la page et à ce que le code se conforme (ou essaie de se conformer) aux règles suivantes PEP8 .

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X