web-dev-qa-db-fra.com

En python, comment importer un nom de fichier commence par un nombre

Fondamentalement, il existe un fichier appelé 8puzzle.py et je souhaite 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). Est-il possible de le faire en Python? J'ai essayé de façon habituelle from 8puzzle import *, cela me donne une erreur.

L'erreur est:

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

Vous pourriez faire

puzzle = __import__('8puzzle')

Problème très intéressant. Je me souviendrai de ne rien nommer avec un numéro.

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

74

Les réponses ci-dessus sont correctes, mais pour l'instant, la méthode recommandée consiste à utiliser la fonction import_module :

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

La fonction import_module () agit comme un wrapper simplifiant autour de 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() renvoie le package ou module spécifié (par exemple pkg.mod), Tandis que __import__() renvoie le package ou module de niveau supérieur ( par exemple pkg).

Si vous importez dynamiquement un module créé depuis le début de l'exécution de l'interpréteur (par exemple, créé un Python), vous devrez peut-être appeler invalidate_caches() pour que le nouveau module à remarquer 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 __import__() intégrée.

Remarque L'importation programmatique de modules doit utiliser import_module() au lieu de cette fonction.

26
laike9m

N'utilisez pas l'extension .py Dans vos importations.

from 8puzzle import * Fonctionne-t-il?

Pour ce qu'il vaut, from x import * N'est pas un modèle Python préféré, car il insère l'espace de noms de ce module dans votre contexte actuel.

En général, essayez d'importer ce que vous voulez spécifiquement de ce module. N'importe quel global de l'autre module peut être importé.

par exemple, si vous avez 8puzzle.foo vous pouvez faire `à partir de l'importation 8puzzle

Éditer:

Bien que mon message .py Soit correct, il n'est pas suffisant.

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

D'une part, il est réservé une interne Python. Vous brisez fondamentalement les hypothèses fondamentales de ce que signifie pouvoir importer un module. Simplement renommer le fichier en quelque chose d'autre, comme puzzle8, y remédiera.

Cela frustrera l'enfer des programmeurs expérimentés Python qui s'attendent à savoir quelles sont vos importations au sommet et s'attendent à ce que le code (essaye) de se conformer à PEP8 .

2
mvanveen