Il existe de nombreuses façons d'importer un fichier python, toutes avec leurs avantages et leurs inconvénients.
Ne vous contentez pas de choisir à la hâte la première stratégie d'importation qui fonctionne pour vous, sinon vous devrez réécrire la base de code plus tard lorsque vous constaterez qu'elle ne répond pas à vos besoins.
Je vais commencer par expliquer l'exemple le plus simple # 1, puis je passerai à l'exemple le plus professionnel et le plus robuste # 7
Exemple 1, importez un module python avec l'interpréteur python:
Mettez ceci 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 via l'interpréteur python, invoqué la fonction python what_does_the_fox_say()
depuis fox.py.
Exemple 2, utilisez execfile
ou ( exec
en Python 3 ) dans un script pour exécuter l'autre fichier python en place:
Mettez ceci dans /home/el/foo2/mylib.py:
def moobar():
print("hi")
Mettez ceci dans /home/el/foo2/main.py:
execfile("/home/el/foo2/mylib.py")
moobar()
exécutez le fichier:
el@apollo:/home/el/foo$ python main.py
hi
La fonction moobar a été importée de mylib.py et mise à disposition dans main.py
Exemple 3, utilisation de la fonctionnalité ... importer ...:
Mettez ceci dans /home/el/foo3/chekov.py:
def question():
print "where are the nuclear wessels?"
Mettez ceci 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 seraient disponibles que si vous import *
Exemple 4, importez riaa.py s'il se trouve dans un emplacement de fichier différent de celui où il est importé
Mettez ceci dans /home/el/foo4/stuff/riaa.py:
def watchout():
print "computers are transforming into a noose and a yoke for humans"
Mettez ceci 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écuter:
el@apollo:/home/el/foo4$ python main.py
computers are transforming into a noose and a yoke for humans
Cela importe tout 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 via le ferroutage du startuphook python:
Mise à jour: Cet exemple fonctionnait à la fois pour python2 et 3, mais ne fonctionne désormais que pour python2. python3 s'est débarrassé de cet ensemble de fonctionnalités de démarrage de l'utilisateur car il a été utilisé abusivement par les rédacteurs de bibliothèque python peu qualifiés, l'utilisant 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 faire preuve de plus de créativité. Si je vous dis comment le faire, les développeurs de python désactiveront également cet ensemble de fonctionnalités, vous êtes donc seul.
Voir: https://docs.python.org/2/library/user.html
Mettez ce code dans votre répertoire personnel ~/.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'
cela signifie que vous utilisez python3, les startuphooks y sont désactivés par défaut.
Le mérite de cette liste va à: https://github.com/docwhat/homedir-examples/blob/master/python-commandline/.pythonrc.py Envoyez le long de vos up-boats.
Exemple 7, le plus robuste: importez des fichiers en python avec la commande d'importation nue:
- 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:
el@apollo:/home/el/foo5/herp$ touch __init__.py
el@apollo:/home/el/foo5/herp$ ls
__init__.py
Créez un nouveau répertoire / home / el / foo5 / herp / derp
Sous derp, créez 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-le ici:
def skycake():
print "SkyCake evolves to stay just beyond the cognitive reach of " +
"the bulk of men. SKYCAKE!!"
Le moment de vérité, créez le nouveau fichier /home/el/foo5/main.py
, mettez-le dedans;
from herp.derp.yolo import skycake
skycake()
Exécuter:
el@apollo:/home/el/foo5$ python main.py
SkyCake evolves to stay just beyond the cognitive reach of the bulk
of men. SKYCAKE!!
Le __init__.py
fichier vide indique à l'interpréteur python que le développeur a l'intention que ce répertoire soit un package importable.
Si vous souhaitez voir mon article sur la façon d'inclure TOUS les fichiers .py dans un répertoire, voir ici: https://stackoverflow.com/a/20753073/445131