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 :
-
Mets ça dans /home/el/foo/fox.py :
def what_does_the_fox_say():
print("vixens cry")
-
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 :
-
Mettez ceci dans /home/el/foo2/mylib.py :
def moobar():
print("hi")
-
Mets ça dans /home/el/foo2/main.py :
execfile("/home/el/foo2/mylib.py")
moobar()
-
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 ..." :
-
Mets ça dans /home/el/foo3/chekov.py :
def question():
print "where are the nuclear wessels?"
-
Mets ça dans /home/el/foo3/main.py :
from chekov import question
question()
-
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é
-
Mets ça dans /home/el/foo4/stuff/riaa.py :
def watchout():
print "computers are transforming into a noose and a yoke for humans"
-
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()
-
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 :
-
Créer un nouveau répertoire /home/el/foo5/
-
Créer un nouveau répertoire /home/el/foo5/herp
-
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
-
Créer un nouveau répertoire /home/el/foo5/herp/derp
-
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
-
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!!"
-
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()
-
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
2 votes
Voir aussi : stackoverflow.com/questions/8663076/
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 utiliserfrom current_directory_name import *
oufrom current_directory_name import THINGS_YOU_WANT_TO_IMPORT
. Jouez un peu avec l'importation à partir de différents répertoires.