1261 votes

Comment importer d'autres fichiers Python ?

Comment importer des fichiers en Python ? Je veux importer :

  1. un fichier (par exemple file.py )
  2. un dossier
  3. un fichier de façon dynamique au moment de l'exécution, sur la base des entrées de l'utilisateur
  4. une partie spécifique d'un fichier (par exemple, une seule fonction)

2 votes

10 votes

Si A et B sont deux fichiers situés dans le même répertoire, dans python 3.x, et que vous souhaitez importer le contenu de A, import A ne fonctionnera pas. Nous devons utiliser from current_directory_name import * ou from current_directory_name import THINGS_YOU_WANT_TO_IMPORT . Jouez un peu avec l'importation à partir de différents répertoires.

1469voto

Eric Leschinski Points 14289

Il existe plusieurs façons d'importer un fichier python, chacune ayant ses avantages et ses inconvénients.

Ne vous contentez pas de choisir à la hâte la première stratégie d'importation qui vous convient, sinon vous devrez réécrire le code plus tard lorsque vous constaterez qu'il ne répond pas à vos besoins.

Je commencerai par expliquer l'exemple #1, le plus simple, puis je passerai à l'exemple #7, le plus professionnel et le plus solide.

Exemple 1, Importer un module python avec l'interpréteur python :

  1. Mets ça dans /home/el/foo/fox.py :

    def what_does_the_fox_say():
      print("vixens cry")
  2. Entrez dans l'interpréteur python :

    el@apollo:/home/el/foo$ python
    Python 2.7.3 (default, Sep 26 2013, 20:03:06) 
    >>> import fox
    >>> fox.what_does_the_fox_say()
    vixens cry
    >>> 

    Vous avez importé fox par l'intermédiaire de l'interpréteur python, invoqué la fonction python what_does_the_fox_say() depuis le fichier fox.py.

Exemple 2, utiliser execfile ou ( exec dans Python 3 ) dans un script pour exécuter l'autre fichier python à la place :

  1. Mettez ceci dans /home/el/foo2/mylib.py :

    def moobar():
      print("hi")
  2. Mets ça dans /home/el/foo2/main.py :

    execfile("/home/el/foo2/mylib.py")
    moobar()
  3. exécuter le fichier :

    el@apollo:/home/el/foo$ python main.py
    hi

    La fonction moobar a été importée de mylib.py et rendue disponible dans main.py.

Exemple 3, utilisation de la fonctionnalité "from ... import ..." :

  1. Mets ça dans /home/el/foo3/chekov.py :

    def question():
      print "where are the nuclear wessels?"
  2. Mets ça dans /home/el/foo3/main.py :

    from chekov import question
    question()
  3. Exécutez-le comme ceci :

    el@apollo:/home/el/foo3$ python main.py 
    where are the nuclear wessels?

    Si vous avez défini d'autres fonctions dans chekov.py, elles ne seront pas disponibles, sauf si vous import *

Exemple 4, Importer riaa.py s'il se trouve dans un emplacement de fichier différent de celui où il est importé

  1. Mets ça dans /home/el/foo4/stuff/riaa.py :

    def watchout():
      print "computers are transforming into a noose and a yoke for humans"
  2. Mets ça dans /home/el/foo4/main.py :

    import sys 
    import os
    sys.path.append(os.path.abspath("/home/el/foo4/stuff"))
    from riaa import *
    watchout()
  3. Exécutez-le :

    el@apollo:/home/el/foo4$ python main.py 
    computers are transforming into a noose and a yoke for humans

    Cela importe tout ce qui se trouve dans le fichier étranger à partir d'un répertoire différent.

Exemple 5, utilisez os.system("python yourfile.py")

import os
os.system("python yourfile.py")

Exemple 6, importez votre fichier en utilisant le startuphook de python :

Mise à jour : Cet exemple fonctionnait à la fois pour python2 et 3, mais ne fonctionne plus que pour python2. python3 s'est débarrassé de cet ensemble de fonctionnalités de startuphook utilisateur parce qu'il était utilisé de manière abusive par des auteurs de bibliothèques python peu qualifiés, qui l'utilisaient pour injecter impoliment leur code dans l'espace de noms global, avant tous les programmes définis par l'utilisateur. Si vous voulez que cela fonctionne pour python3, vous devrez être plus créatif. Si je vous dis comment faire, les développeurs python désactiveront également cette fonctionnalité, et vous devrez donc vous débrouiller tout seul.

Voir : https://docs.python.org/2/library/user.html

Placez ce code dans votre répertoire personnel dans ~/.pythonrc.py

class secretclass:
    def secretmessage(cls, myarg):
        return myarg + " is if.. up in the sky, the sky"
    secretmessage = classmethod( secretmessage )

    def skycake(cls):
        return "cookie and sky pie people can't go up and "
    skycake = classmethod( skycake )

Mettez ce code dans votre main.py (peut être n'importe où) :

import user
msg = "The only way skycake tates good" 
msg = user.secretclass.secretmessage(msg)
msg += user.secretclass.skycake()
print(msg + " have the sky pie! SKYCAKE!")

Exécutez-le, vous devriez obtenir ceci :

$ python main.py
The only way skycake tates good is if.. up in the sky, 
the skycookie and sky pie people can't go up and  have the sky pie! 
SKYCAKE!

Si vous obtenez une erreur ici : ModuleNotFoundError: No module named 'user' alors cela signifie que vous utilisez python3, les startuphooks y sont désactivés par défaut.

Le crédit pour cette histoire revient à : https://github.com/docwhat/homedir-examples/blob/master/python-commandline/.pythonrc.py Envoyez vos bateaux de sauvetage.

Exemple 7, le plus robuste : Importez des fichiers en python avec la commande bare import :

  1. Créer un nouveau répertoire /home/el/foo5/

  2. Créer un nouveau répertoire /home/el/foo5/herp

  3. Créez un fichier vide nommé __init__.py sous herpès :

    el@apollo:/home/el/foo5/herp$ touch __init__.py
    el@apollo:/home/el/foo5/herp$ ls
    __init__.py
  4. Créer un nouveau répertoire /home/el/foo5/herp/derp

  5. Sous derp, faire un autre __init__.py fichier :

    el@apollo:/home/el/foo5/herp/derp$ touch __init__.py
    el@apollo:/home/el/foo5/herp/derp$ ls
    __init__.py
  6. Sous /home/el/foo5/herp/derp, créez un nouveau fichier appelé yolo.py Mettez ça là-dedans :

    def skycake():
      print "SkyCake evolves to stay just beyond the cognitive reach of " +
      "the bulk of men. SKYCAKE!!"
  7. Le moment de vérité, faire le nouveau dossier /home/el/foo5/main.py mettez ça là-dedans ;

    from herp.derp.yolo import skycake
    skycake()
  8. Exécutez-le :

    el@apollo:/home/el/foo5$ python main.py
    SkyCake evolves to stay just beyond the cognitive reach of the bulk 
    of men. SKYCAKE!!

    Le vide __init__.py communique à l'interpréteur python que le développeur souhaite que ce répertoire soit un paquetage importable.

Si vous voulez voir mon article sur la façon d'inclure TOUS les fichiers .py dans un répertoire, cliquez ici : https://stackoverflow.com/a/20753073/445131

11 votes

Vous devriez également ajouter l'exemple 6 : utiliser __import__(py_file_name) . Guide étonnant en tout cas

8 votes

Chaque fois que j'ai un problème d'importation, je finis par consulter cette question et je parviens toujours à résoudre mon problème. Si je pouvais donner une note positive pour chaque fois que vous m'avez aidé, je le ferais.

9 votes

Quelle est la grande différence entre tous ces produits, et pourquoi l'un d'entre eux est-il meilleur que les autres ? Dans l'exemple 5, vous écrivez "Importer des fichiers en python avec la commande bare import", mais vous utilisez également la commande import (bare ?) dans les exemples 1, 3 et 4, n'est-ce pas ?

552voto

Radian Points 1092

importlib a été ajouté à Python 3 pour importer un module de manière programmatique.

import importlib

moduleName = input('Enter module name:')
importlib.import_module(moduleName)

L'extension .py doit être supprimée de moduleName . La fonction définit également un package argument pour les importations relatives.

Dans python 2.x :

  • Juste import file sans l'extension .py
  • Un dossier peut être marqué comme un paquet, en ajoutant un élément vide __init__.py fichier
  • Vous pouvez utiliser le __import__ qui prend le nom du module (sans extension) sous la forme d'une extension de chaîne de caractères

    pmName = input('Enter module name:') pm = import(pmName) print(dir(pm))

Type help(__import__) pour plus de détails.

9 votes

Si vous ajoutez un import filename au init .py alors vous pouvez importer le module directement comme nom de dossier.

13 votes

De help(__import__) : Because this function is meant for use by the Python interpreter and not for general use it is better to use importlib.import_module() to programmatically import a module.

12 votes

Et si ce n'est pas un paquet mais juste un fichier script ?

182voto

Bohao LI Points 113

Premier cas

Vous voulez importer un fichier A.py dans le fichier B.py ces deux fichiers sont dans le même dossier, comme ceci :

. 
 A.py 
 B.py

Vous pouvez le faire dans le fichier B.py :

import A

ou

from A import *

ou

from A import THINGS_YOU_WANT_TO_IMPORT_IN_A

Vous pourrez alors utiliser toutes les fonctions du fichier A.py dans le fichier B.py


Deuxième cas

Vous voulez importer un fichier folder/A.py dans le fichier B.py ces deux fichiers ne sont pas dans le même dossier, comme ceci :

.
 B.py
 folder
      A.py

Vous pouvez le faire dans le fichier B.py :

import folder.A

ou

from folder.A import *

ou

from folder.A import THINGS_YOU_WANT_TO_IMPORT_IN_A

Vous pourrez alors utiliser toutes les fonctions du fichier A.py dans le fichier B.py


Résumé

  • Dans le premier cas , fichier A.py est un module que vous importez dans le fichier B.py vous avez utilisé la syntaxe import module_name .
  • Dans le deuxième cas , folder est le paquet qui contient le module A.py vous avez utilisé la syntaxe import package_name.module_name .

Pour plus d'informations sur les paquets et les modules, consultez le site suivant lien .

96voto

James Points 3068

Pour importer un fichier Python spécifique au moment de l'exécution avec un nom connu :

import os
import sys

...

scriptpath = "../Test/"

# Add the directory containing your module to the Python path (wants absolute paths)
sys.path.append(os.path.abspath(scriptpath))

# Do the import
import MyModule

2 votes

Mon ami a vérifié cela aujourd'hui sans succès - il semble que le nom de fichier ne devrait pas être là. Il a utilisé un fichier local dans le répertoire parent et "./" a fonctionné à la fin comme si le répertoire parent (..). La résolution du problème dans le post a été rejetée - probablement un malentendu( ?) Imprimez sys.path et comparez les enregistrements si vous n'êtes pas sûr...

2 votes

Pour moi c'était la meilleure réponse, concise et facilement reproductible

41voto

Fatih Karatana Points 481

Vous n'avez pas beaucoup de méthodes complexes pour importer un fichier python d'un dossier à un autre. Il suffit de créer un __init__.py pour déclarer que ce dossier est un paquetage python, puis allez dans votre fichier hôte où vous voulez importer, tapez simplement

from root.parent.folder.file import variable, class, whatever

34 votes

Et si je veux un chemin relatif ?

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