web-dev-qa-db-fra.com

Comment importer d'autres fichiers Python?

Comment importer d'autres fichiers en Python?

  1. Comment puis-je importer un fichier python spécifique tel que import file.py?
  2. Comment puis-je importer un dossier au lieu d'un fichier spécifique?
  3. Je souhaite charger un fichier Python de manière dynamique au moment de l'exécution, en fonction de l'utilisateur Input.
  4. Je veux savoir comment charger une seule partie du fichier.

Par exemple, dans main.py j'ai:

from extra import * 

Bien que cela me donne toutes les définitions dans extra.py, quand tout ce que je veux, c’est une définition unique:

def gap():
    print
    print

Qu'est-ce que j'ajoute à l'instruction import pour obtenir simplement gap à partir de extra.py?

572
Tamer

importlib est une addition récente en Python pour importer un module par programme. C'est juste un wrapper autour de __import__ Voir https://docs.python.org/3/library/importlib.html#module-importlib

import importlib

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

Mise à jour: La réponse ci-dessous est obsolète. Utilisez la variante la plus récente ci-dessus.

  1. Juste import file sans l'extension '.py'.

  2. Vous pouvez marquer un dossier en tant que package en ajoutant un fichier vide nommé __init__.py.

  3. Vous pouvez utiliser la fonction __import__. Il prend le nom du module sous forme de chaîne. (Encore une fois: nom du module sans l'extension '.py'.)

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

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

333
Radian

Il existe de nombreuses manières d’importer un fichier Python, le tout avec leurs avantages et inconvénients.

Ne choisissez pas simplement à la hâte la première stratégie d’importation qui fonctionne pour vous, sinon vous devrez réécrire la base de code ultérieurement, lorsque vous constaterez qu’elle ne répond pas à vos besoins. 

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

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

  1. Mettez ceci 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 via l’interpréteur python, appelé 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:

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

    def moobar():
      print("hi")
    
  2. Mettez ceci dans /home/el/foo2/main.py:

    execfile("/home/el/foo2/mylib.py")
    moobar()
    
  3. lance 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, Utiliser à partir de ... fonctionnalité d'importation ...:

  1. Mettez ceci dans /home/el/foo3/chekov.py:

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

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

    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é

  1. Mettez ceci dans /home/el/foo4/stuff/riaa.py:

    def watchout():
      print "computers are transforming into a noose and a Yoke for humans"
    
  2. 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()
    
  3. 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 en superposant le startuphook en python:

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

Mettez ce code dans votre répertoire personnel en ~/.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écuter: 

$ 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!

Le mérite de ce jist va à: https://github.com/docwhat/homedir-examples/blob/master/python-commandline/.pythonrc.py Envoie tes sous-marins.

Exemple 7, le plus robuste: Importez des fichiers en python à l'aide de la commande d'importation nue:

  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:

    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, créez un autre fichier __init__.py:

    el@apollo:/home/el/foo5/herp/derp$ touch __init__.py
    el@apollo:/home/el/foo5/herp/derp$ ls
    __init__.py
    
  6. Dans/home/el/foo5/herp/derp, créez un nouveau fichier appelé yolo.py Mettez ceci ici:

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

    from herp.derp.yolo import skycake
    skycake()
    
  8. 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 fichier __init__.py vide indique à l'interpréteur python que le développeur souhaite que ce répertoire soit un package importable.

Si vous voulez 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

Bonus protip

que vous utilisiez Mac, Linux ou Windows, vous devez utiliser l'éditeur inactif de python comme décrit ici. Cela ouvrira votre monde de python. http://www.youtube.com/watch?v=DkW5CSZ_VII

787
Eric Leschinski

Pour importer un fichier Python spécifique à "runtime" avec un nom connu:

import os
import sys

...

scriptpath = "../Test/MyModule.py"

# 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
43
James

Vous n'avez pas beaucoup de méthodes complexes pour importer un fichier python d'un dossier à un autre. Créez simplement un fichier __init__.py pour déclarer que ce dossier est un package python, puis accédez à votre fichier hôte où vous souhaitez importer 

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

25
Fatih Karatana

Import doc .. - Lien pour référence 

Les fichiers __init__.py sont nécessaires pour que Python traite les répertoires comme contenant des packages, ceci afin d'empêcher les répertoires portant un nom commun, tel que string, de masquer par inadvertance des modules valides apparaissant ultérieurement dans le chemin de recherche des modules.

__init__.py peut simplement être un fichier vide, mais il peut également exécuter le code d'initialisation du package ou définir la variable __all__.

mydir/spam/__init__.py
mydir/spam/module.py
import spam.module
or
from spam import module
15
Sanyal
from file import function_name  ######## Importing specific function
function_name()                 ######## Calling function

et 

import file              ######## Importing whole package
file.function1_name()    ######## Calling function
file.function2_name()    ######## Calling function

Voici les deux manières simples que j'ai déjà comprises et que votre fichier "file.py" que vous souhaitez importer en tant que bibliothèque est uniquement présent dans votre répertoire actuel.

7
Devendra Bhat

le meilleur moyen d'importer des fichiers .py est d'utiliser __init__.py. La solution la plus simple consiste à créer un fichier vide nommé __init__.py dans le même répertoire que le fichier your.py.

this post de Mike Grouchy est une excellente explication de __init__.py et de son utilisation pour la création, l’importation et la configuration de paquets Python.

4
supreme

La manière dont j'importe est d'importer le fichier et d'utiliser un raccourci de son nom.

import DoStuff.py as DS
DS.main()

N'oubliez pas que votre fichier d'importation DOIT ÊTRE nommé avec l'extension .py

3
Luke359

Je voudrais ajouter cette note que je ne fais pas très clairement ailleurs; dans un module/package, lors du chargement à partir de fichiers, le nom du module/package doit être précédé de la variable mymodule. Imaginez mymodule étant la disposition comme ceci:

/main.py
/mymodule
    /__init__.py
    /somefile.py
    /otherstuff.py

Lors du chargement de somefile.py/otherstuff.py à partir de __init__.py, le contenu devrait ressembler à ceci:

from mymodule.somefile import somefunc
from mymodule.otherstuff import otherfunc
3
Svend

Vous pouvez inclure votre script python avec le nom abc.py de deux manières différentes.

  1. par exemple. si votre fichier s'appelle abc.py (import abc) La limitation est que votre fichier doit être présent au même emplacement que votre script d'appel python.

importer abc

  1. par exemple. si votre fichier python se trouve dans le dossier Windows. Le dossier Windows est présent au même endroit que votre script appelant python.

depuis l'import de dossier abc

  1. Le script Incase abc.py est disponible dans le dossier internal_dolder qui est présent dans le dossier.

depuis folder.internal_folder import abc

  1. Comme l'a répondu James ci-dessus, dans le cas où votre fichier se trouve à un emplacement déterminé

importation os
système d'importation
scriptpath = "../Test/MyModule.py"
sys.path.append (os.path.abspath (chemin du script))
importer MyModule

Si votre script python est mis à jour et que vous ne souhaitez pas le télécharger, utilisez ces instructions pour l'actualisation automatique. Prime :)

%load_ext autoreload 
%autoreload 2
1
rishi jain

Si le module que vous voulez importer est pas dans un sous-répertoire , essayez alors et exécutez app.py à partir du répertoire parent le plus profond:

Structure du répertoire:

/path/to/common_dir/module/file.py
/path/to/common_dir/application/app.py
/path/to/common_dir/application/subpath/config.json

Dans app.py, ajoutez le chemin du client à sys.path:

import os, sys, inspect

sys.path.append(os.getcwd())
from module.file import MyClass
instance = MyClass()

Facultatif (si vous chargez, par exemple, une configuration) (Inspect semble être le plus robuste pour mes cas d'utilisation)

# Get dirname from inspect module
filename = inspect.getframeinfo(inspect.currentframe()).filename
dirname = os.path.dirname(os.path.abspath(filename))
MY_CONFIG = os.path.join(dirname, "subpath/config.json")

Courir

user@Host:/path/to/common_dir$ python3 application/app.py

Cette solution fonctionne pour moi dans cli, ainsi que PyCharm.

1
Christoph Schranz

Juste pour importer un fichier python dans un autre fichier python

disons que j'ai helper.py fichier python qui a une fonction d'affichage comme,

def display():
    print("I'm working sundar gsv")

Maintenant dans app.py , vous pouvez utiliser la fonction d’affichage,

import helper
helper.display()

Le résultat,

I'm working sundar gsv

NOTE: Pas besoin de spécifier l'extension .py.

0
Sundar Gsv

Une fonctionnalité très inconnue de Python est la possibilité d'importer des fichiers Zip:

library.Zip
|-library
|--__init__.py

Le fichier __init__.py du package contient les éléments suivants:

def dummy():
    print 'Testing things out...'

Nous pouvons écrire un autre script permettant d'importer un package à partir de l'archive Zip. Il suffit d’ajouter le fichier Zip au fichier sys.path.

import sys
sys.path.append(r'library.Zip')

import library

def run():
    library.dummy()

run()
0
Farsheed

Vous pouvez aussi faire ceci: from filename import something

exemple: from client import Client Notez que vous n'avez pas besoin de l'extension .py .pyw .pyui.

0
Lucas Soares

Premier cas: vous voulez importer le 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

Ensuite, vous pourrez utiliser toutes les fonctions du fichier A.py dans le fichier B.py.


Deuxième cas: vous voulez importer le 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:

import folder.A

Ensuite, vous pourrez utiliser toutes les fonctions du fichier A.py dans le fichier B.py.


Résumé: Dans le premier cas, le fichier A.py est un module que vous importez dans le fichier B.py, vous avez utilisé la syntaxe import module_name. Dans le second cas, folder est le package qui contient le module A.py, vous avez utilisé la syntaxe import package_name.module_name.

Pour plus d’informations sur les packages et les modules, consultez ce link .

0
Bohao LI

Comme indiqué ci-dessus, il existe de nombreuses manières, mais je constate que je veux juste importer le contenu d'un fichier, et que je ne veux pas écrire de lignes et que je dois importer autres modules . J'ai donc trouvé un moyen d'obtenir le contenu d'un fichier, même avec la syntaxe à points (file.property), par opposition à la fusion du fichier importé avec le vôtre .
Tout d’abord, voici mon fichier que je vais importer, data.py

    testString= "A string literal to import and test with"


Remarque: Vous pouvez utiliser l'extension .txt à la place de .
Dans mainfile.py, commencez par ouvrir et récupérer le contenu.

    #!usr/bin/env python3
    Data=open('data.txt','r+').read()

Vous avez maintenant le contenu sous forme de chaîne, mais tenter d'accéder à data.testString provoquera une erreur, car data est une instance de la classe str et, même si elle possède une propriété testString, elle ne fera pas ce que vous attendiez.
Ensuite, créez une classe. Par exemple (jeu de mots voulu), ImportedFile

    class ImportedFile:

Et mettez ceci dedans (avec l'indentation appropriée):

    exec(data)


Et enfin, réaffectez data comme suit:

    data=ImportedFile()

Et c'est tout! Accédez simplement comme vous le feriez pour n’importe quel autre module, en tapant print(data.testString) pour imprimer sur la console A string literal to import and test with.
Si, toutefois, vous souhaitez obtenir l'équivalent de from mod import *, supprimez simplement la classe, l'assignation d'instance et supprimez la exec.

J'espère que cela t'aides:)
- Benji

0
Benj

C’est ainsi que j’ai appelé une fonction à partir d’un fichier python, ce qui me permet d’appeler n’importe quelle fonction.

import os, importlib, sys

def callfunc(myfile, myfunc, *args):
    pathname, filename = os.path.split(myfile)
    sys.path.append(os.path.abspath(pathname))
    modname = os.path.splitext(filename)[0]
    mymod = importlib.import_module(modname)
    result = getattr(mymod, myfunc)(*args)
    return result

result = callfunc("pathto/myfile.py", "myfunc", arg1, arg2)
0
Xiao-Feng Li

Cela peut paraître fou, mais vous pouvez simplement créer un lien symbolique vers le fichier que vous souhaitez importer si vous créez simplement un script wrapper.

0
Jonathan

Si la fonction définie est dans un fichier x.py:

def greet():
    print('Hello! How are you?')

Dans le fichier où vous importez la fonction, écrivez ceci:

from x import greet

Ceci est utile si vous ne souhaitez pas importer toutes les fonctions d'un fichier.

0
Sid