web-dev-qa-db-fra.com

Est-il possible d’utiliser des tirets dans les fichiers Python lorsqu’on essaie de les importer?

En gros, quand j’ai un fichier python comme:

python-code.py

et utilise:

import (python-code)

l'interprète me donne une erreur de syntaxe.

Des idées sur la façon de résoudre ce problème? Les tirets sont-ils illégaux dans les noms de fichiers python?

109
Joan Venge

Vous devriez consulter PEP 8 , le Guide de style pour le code Python:

Noms des modules et des modules Les modules doivent avoir des noms courts en minuscules. Les traits de soulignement peuvent être utilisés dans le nom du module si cela améliore la lisibilité. Les paquets Python devraient également avoir des noms courts en minuscules, bien que l'utilisation des traits de soulignement soit déconseillée.

Etant donné que les noms de modules sont mappés sur les noms de fichiers et que certains systèmes de fichiers ne tiennent pas compte de la casse et tronquent les noms longs, il est important de choisir des noms de module assez courts. problème lorsque le code est transporté vers des versions plus anciennes de Mac ou Windows, ou DOS.

En d'autres termes: renommer votre fichier :)

134
Paolo Bergantino

Une autre chose à noter dans votre code est que l'importation n'est pas une fonction. Donc, import(python-code) devrait être import python-code qui, comme certains l’ont déjà mentionné, est interprété comme "importer du code python moins", et non ce que vous vouliez. Si vous avez vraiment besoin d'importer un fichier avec un tiret dans son nom, vous pouvez procéder comme suit:

python_code = __import__('python-code')

Mais, comme mentionné également ci-dessus, ce n'est pas vraiment recommandé. Vous devriez changer le nom du fichier si c'est quelque chose que vous contrôlez.

103
Rick Copeland

TLDR

Les tirets sont non illégaux, mais vous ne devez pas les utiliser pour 3 raisons:

  1. Vous avez besoin d'une syntaxe spéciale pour importer des fichiers avec des tirets
  2. Personne ne s'attend à un nom de module avec un tiret
  3. C'est contre les recommandations du Python Style Guide

Si vous devez absolument importer un nom de fichier avec un tiret, la syntaxe spéciale est la suivante:

module_name = __import__('module-name')

Curieux de savoir pourquoi nous avons besoin d’une syntaxe spéciale?

La raison de la syntaxe spéciale est que, lorsque vous écrivez import somename, vous créez un objet module avec l'identificateur somename (vous pouvez donc l'utiliser ultérieurement, par exemple, avec somename.funcname). Bien sûr, module-name n'est pas un identifiant valide et donc la syntaxe spéciale qui en donne un valide.

Vous n'obtenez pas pourquoi le nom de module n'est pas un identifiant valide?

Ne vous inquiétez pas - je ne l'ai pas non plus. Voici un conseil pour vous aider: Regardez cette ligne python: x=var1-var2. Voyez-vous une soustraction à droite de l'affectation ou un nom de variable avec un tiret?

PS

Rien d'original dans ma réponse sauf d'inclure ce que je considérais être les informations les plus pertinentes parmi toutes les autres réponses réunies au même endroit

30
ndemou

Le problème est que python-code n'est pas un identifiant. L'analyseur voit ceci comme python moins code. Bien sûr, cela ne fera pas ce que vous demandez. Vous devrez utiliser un nom de fichier qui est également un identifiant python valide. Essayez de remplacer le - par un trait de soulignement.

Vous pourriez probablement l'importer via un hack __import__, mais si vous ne savez pas déjà comment, vous ne devriez pas. Les noms de modules Python doivent être des noms de variables valides ("identificateurs") - cela signifie que si vous avez un module foo_bar, vous pouvez l’utiliser depuis Python (print foo_bar). Vous ne pourriez pas le faire avec un nom étrange (print foo-bar -> erreur de syntaxe).

4
John Millikin

Bien que nommer correctement les fichiers soit la meilleure solution, si python-code n’est pas sous notre contrôle, un piratage utilisant __import__ est préférable à la copie, au changement de nom ou à la modification du code d’auteurs. Cependant, j'ai essayé et cela n'a pas fonctionné à moins de renommer le fichier en ajoutant l'extension .py. Après avoir regardé la doc pour dériver comment obtenir une description de .py, je me suis retrouvé avec ceci:

import imp

try:
    python_code_file = open("python-code")
    python_code = imp.load_module('python_code', python_code_file, './python-code', ('.py', 'U', 1))
finally:
    python_code_file.close()

Il a créé un nouveau fichier python-codec lors de la première exécution.

0
Ale

Sur Python 3, utilisez import_module :

from importlib import import_module
python_code = import_module('python-code')

Plus généralement,

import_module('package.subpackage.module')
0
e18r