Comment inclure du code Python externe à utiliser dans d'autres fichiers?

117

Si vous avez une collection de méthodes dans un fichier, existe-t-il un moyen d'inclure ces fichiers dans un autre fichier, mais de les appeler sans aucun préfixe (par exemple, préfixe de fichier)?

Donc si j'ai:

[Math.py]
def Calculate ( num )

Comment l'appeler comme ça:

[Tool.py]
using Math.py

for i in range ( 5 ) :
    Calculate ( i )
Joan Venge
la source

Réponses:

154

Vous devrez importer l'autre fichier en tant que module comme celui-ci:

import Math

Si vous ne souhaitez pas préfixer votre Calculatefonction avec le nom du module, procédez comme suit:

from Math import Calculate

Si vous souhaitez importer tous les membres d'un module, procédez comme suit:

from Math import *

Edit: Voici un bon chapitre de Dive Into Python qui va un peu plus en profondeur sur ce sujet.

Andrew Hare
la source
9
A noter que ce from Math import *n'est pas recommandé .
naught101
1
Vous pouvez impmodule intéressant et appel magique __import__.
Vitold S.
Quelqu'un a oublié de renouveler son domaine: \
Spechal
48

Écrivez simplement la commande "inclure":

import os

def include(filename):
    if os.path.exists(filename): 
        execfile(filename)


include('myfile.py')

@Deleet:

La remarque @bfieck est correcte, pour la compatibilité python 2 et 3, vous avez besoin soit:

Python 2 et 3: alternative 1

from past.builtins import execfile

execfile('myfile.py')

Python 2 et 3: alternative 2

exec(compile(open('myfile.py').read()))
Louis
la source
3
Y a-t-il une raison de refaire cela from module import *? De plus, si le fichier que vous appelez contient du code dans le corps, ce code sera exécuté, si vous faites cela.
naught101
4
@ naught101: C'est le but: exécuter le code, ce qui ne se produit pas avec une importation. Habituellement, il s'agit simplement de définir des variables.
Louis
2
@Deleet python 3 n'a pasexecfile
bfieck
7
En fait, python 3 a une autre signature compile()que celle mentionnée. Donc, le bon Python 2 et 3: l'alternative 2 sera:exec(compile(source=open('myfile.py').read(), filename='myfile.py', mode='exec'))
TriAnMan
3
La fonction d'assistance 'include' ne fonctionne pas si vous voulez avoir des variables dans le fichier inclus dans la portée de l'appelant de 'include'
paulj
35

Si tu utilises:

import Math

alors cela vous permettra d'utiliser les fonctions de Math, mais vous devez faire Math.Calculate, donc c'est évidemment ce que vous ne voulez pas.

Si vous souhaitez importer les fonctions d'un module sans avoir à les préfixer, vous devez les nommer explicitement, comme:

from Math import Calculate, Add, Subtract

Désormais, vous pouvez référencer Calculer, Ajouter et Soustraire uniquement par leurs noms. Si vous souhaitez importer TOUTES les fonctions de Math, procédez comme suit:

from Math import *

Cependant, vous devez être très prudent lorsque vous faites cela avec des modules dont vous n'êtes pas sûr du contenu. Si vous importez deux modules qui contiennent des définitions pour le même nom de fonction, une fonction écrasera l'autre, vous n'en serez pas plus sage.

Ryeguy
la source
1

J'ai trouvé le module d'inspection python très utile

Par exemple avec teststuff.py

import inspect

def dostuff():
    return __name__

DOSTUFF_SOURCE = inspect.getsource(dostuff)

if __name__ == "__main__":

    dostuff()

Et depuis un autre script ou la console python

import teststuff

exec(DOSTUFF_SOURCE)

dostuff()

Et maintenant, dostuff devrait être dans la portée locale et dostuff () retournera la console ou les scripts _ nom _ alors que l'exécution de test.dostuff () retournera le nom des modules python.

whardier
la source