Comment importer d'autres fichiers Python?

799

Comment importer d'autres fichiers en Python?

  1. Comment puis-je importer un fichier python spécifique comme import file.py?
  2. Comment importer un dossier au lieu d'un fichier spécifique?
  3. Je souhaite charger dynamiquement un fichier Python lors de l'exécution, en fonction de l'entrée utilisateur.
  4. Je veux savoir comment charger une seule partie spécifique du fichier.

Par exemple, dans main.pyJ'ai:

from extra import * 

Bien que cela me donne toutes les définitions extra.py, alors peut-être que tout ce que je veux, c'est une seule définition:

def gap():
    print
    print

Que dois - je ajouter à la importdéclaration pour obtenir juste gapde extra.py?

Dompteur
la source

Réponses:

443

importliba été ajouté à Python 3 pour importer par programme un module. C'est juste un wrapper __import__, voir les documents .

import importlib

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

Remarque: l' .pyextension doit être supprimée de moduleName. La fonction définit également un packageargument pour les importations relatives.


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

  1. Juste import filesans 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 __import__fonction. 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.

Radian
la source
7
Si vous ajoutez un import filenameau fichier .py init, vous pouvez importer le module directement en tant que nom de dossier.
CornSmith du
9
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.
Tadhg McDonald-Jensen
6
Et si ce n'est pas un package mais juste un fichier de script?
Jonathan
3
Pour importer un fichier de script dans le même chemin (peut-être que cela fonctionnerait également pour un fichier de script dans un chemin de recherche Python), cela import filenamenoextfonctionne très bien pour moi, avec Python 3.4.8.
Alex Hall
7
Est-ce toujours exact en 2019? Est-ce python3 ou 2?
Sandburg
1032

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:

  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, invoqué la fonction python what_does_the_fox_say()depuis fox.py.

Exemple 2, utilisez execfileou ( execen 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. 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 ...:

  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 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é

  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 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:

  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__.pysous herp:

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

  5. Sous derp, créez un autre __init__.pyfichier:

    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.pyMettez-le 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é, créez le nouveau fichier /home/el/foo5/main.py, mettez-le 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 __init__.pyfichier 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

Eric Leschinski
la source
6
Vous devez également ajouter l'exemple 6: utilisation __import__(py_file_name). Guide incroyable quand même
oriadam
4
Chaque fois que j'ai un problème d'importation, je me retrouve à cette question et je suis toujours en mesure de résoudre mon problème. Si je pouvais voter pour chaque fois que vous m'avez aidé, je le ferais.
dgBP
4
Quelle est la grande différence entre tous ces éléments et pourquoi est-elle meilleure que les autres? Par exemple 5, vous écrivez «Importer des fichiers en python avec la commande d'importation nue», mais vous utilisez également la commande d'importation (nue?) Dans les exemples 1, 3 et 4, n'est-ce pas?
HelloGoodbye
34
Bonne réponse mais le fait que vous utilisiez un fichier d'importation différent à titre d'exemple tout le temps rend la lecture fastidieuse.
gented
2
Je tiens à souligner que même si vous travaillez sous Windows, l'importation est sensible à la casse. Vous ne pouvez donc pas avoir Module.py et avoir dans votre module d'importation de
radato
66

Pour importer un fichier Python spécifique à «runtime» 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
James
la source
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é le fichier local dans le répertoire parent et "./" a travaillé à la fin comme si le répertoire parent (..). Le problème de correction dans le message a été rejeté - probablement un malentendu (?) Imprimez sys.path et comparez les enregistrements si vous n'êtes pas sûr ...
Tom
29

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, tapez simplement

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

Fatih Karatana
la source
15
Et si je veux un chemin relatif?
domih
22

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

Les __init__.pyfichiers sont nécessaires pour que Python traite les répertoires comme contenant des packages, cela est fait pour empêcher les répertoires avec un nom commun, tel que chaîne, de masquer involontairement des modules valides qui se produisent plus tard sur le chemin de recherche des modules.

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

mydir/spam/__init__.py
mydir/spam/module.py
import spam.module
or
from spam import module
Sanyal
la source
20

Premier cas: vous souhaitez importer un fichier A.pydans un 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

Ensuite, vous pourrez utiliser toutes les fonctions de fichier A.pyen fichierB.py


Deuxième cas: vous souhaitez importer un fichier folder/A.pydans un 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

ou

from folder.A import *

ou

from folder.A import THINGS_YOU_WANT_TO_IMPORT_IN_A

Ensuite, vous pourrez utiliser toutes les fonctions de fichier A.pyen fichierB.py


Résumé: Dans le premier cas, fichier A.pyest un module que vous importez dans fichier B.py, vous avez utilisé la syntaxe import module_name. Dans le second cas, folderc'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 lien .

Bohao LI
la source
J'ai essayé avec un peu de variation et ça a marché. from folder_a.script import *Script.py se trouve dans le dossier a.
Justin
+1 C'est ce que je cherchais. Impossible de comprendre les autres réponses mais vous l'avez expliqué en utilisant les répertoires.
Black Thunder
Que faire si je souhaite importer un fichier py qui se trouve dans le répertoire parent?
bytedev
1
@bytedev Ajoutez import syset sys.path.append("..")au début du fichier. Selon ceci: stackoverflow.com/a/48341902/6057480 . Testé, fonctionnant parfaitement, après cela, vous pourrez importer un fichier py dans le répertoire parent et toujours en mesure d'importer des fichiers py dans le même répertoire et sous-répertoires.
Bohao LI
17
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 moyens simples que j'ai compris maintenant et assurez-vous que votre fichier "file.py" que vous souhaitez importer en tant que bibliothèque est présent dans votre répertoire actuel uniquement.

Devendra Bhat
la source
9

Si la fonction définie se trouve 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.

Sid
la source
7

la meilleure façon d'importer des fichiers .py est par le biais de __init__.py. la chose la plus simple à faire est de créer un fichier vide nommé __init__.pydans le même répertoire que votre fichier .py.

ce message de Mike Grouchy est une excellente explication __init__.pyet son utilisation pour créer, importer et configurer des packages python.

suprême
la source
1
@GhostCat J'ai mis à jour ma réponse. merci pour le lien "ce serait préférable".
suprême
Et comprenez que tout le monde ne vit pas dans votre fuseau horaire.
GhostCat
4
Vous auriez dû publier le contenu du message de Mike Grouchy, d'autant plus que le lien est maintenant 404. web.archive.org/web/20190309045451/https://mikegrouchy.com/blog/…
qwr
6

Comment j'importe, c'est importer le fichier et utiliser le 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

Luke359
la source
3
N'essaierait pas import DoStuff.py as DSd'importer pydepuis DoStuff?
Benj
5

Je voudrais ajouter cette note que je ne vois pas très clairement ailleurs; à l'intérieur d'un module / package, lors du chargement à partir de fichiers, le nom du module / package doit être précédé du mymodule. Imaginez mymoduleque vous disposiez comme ceci:

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

Lors du chargement somefile.py/ à otherstuff.pypartir __init__.pydu contenu devrait ressembler à:

from mymodule.somefile import somefunc
from mymodule.otherstuff import otherfunc
Svend
la source
2

Si le module que vous souhaitez importer ne se trouve pas dans un sous-répertoire , essayez ce qui suit et exécutez-le à app.pypartir du répertoire parent commun 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 des configurations) (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 en cli, ainsi que PyCharm.

Christoph Schranz
la source
2

Il existe deux façons d'inclure votre script python avec le nom abc.py

  1. Par exemple, si votre fichier est appelé abc.py (importation abc) La limitation est que votre fichier doit être présent au même endroit où se trouve votre script python appelant.

importer abc

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

à partir du dossier importation abc

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

à partir de folder.internal_folder import abc

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

import os
import sys
scriptpath = "../Test/MyModule.py"
sys.path.append (os.path.abspath (scriptpath))
import MyModule

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

%load_ext autoreload 
%autoreload 2
rishi jain
la source
1

Juste pour importer un fichier python dans un autre fichier python

disons que j'ai un fichier python helper.py 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

REMARQUE: il n'est pas nécessaire de spécifier l'extension .py.

Sundar Gsv
la source
1

Cela peut sembler 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.

Jonathan
la source
1

Vous pouvez également le faire: from filename import something

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

Lucas Soares
la source
1

C'est ainsi que j'ai fait pour appeler une fonction à partir d'un fichier python, ce qui est flexible pour moi 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)
Xiao-Feng Li
la source
Comment rendre une nouvelle fonction meilleure que son utilisation directe?
qwr
@qwr La nouvelle fonction callfunc () est simplement un wrapper du code pour appeler dynamiquement la fonction cible dans le fichier python. L'exemple donné est la cible "myfunc" dans le fichier python "pathto / myfile.py". Qu'entendez-vous par «utiliser directement la fonction»?
Xiao-Feng Li
A parfaitement fonctionné pour moi. Dans mon exemple, j'ai remplacé: from mypath import Pathpar Path = callfunc("/folder/to/mypath.py", "Path"). Merci @ Xiao-FengLi
user319436
@ user319436 Heureux que ma réponse aide enfin quelqu'un. :)
Xiao-Feng Li
Merci @ xiao-feng-li !! Très bonne réponse!!
Altières de Matos le
0

Il existe de nombreuses façons, comme indiqué ci-dessus, mais je trouve que je veux juste importer le contenu d'un fichier, et ne pas avoir à écrire des lignes et des lignes et importer d' autres modules. J'ai donc trouvé un moyen d'obtenir le contenu d'un fichier, même avec la syntaxe à points ( file.property) au lieu de fusionner le 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' .txtextension à la place.
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 essayer d'accéder data.testStringentraînera une erreur, tout comme dataune instance de la strclasse, et même s'il a une propriété, testStringil ne fera pas ce que vous attendiez.
Ensuite, créez une classe. Par exemple (jeu de mots voulu),ImportedFile

    class ImportedFile:

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

    exec(data)


Et enfin, réaffectez datacomme ceci:

    data=ImportedFile()

Et c'est tout! Accédez simplement comme vous le feriez pour n'importe quel autre module, la frappe print(data.testString)s'imprimera sur la console A string literal to import and test with.
Si, cependant, vous voulez l'équivalent de from mod import *simplement supprimer la classe, l'affectation d'instance et supprimer la dent exec.

J'espère que cela aide :)
-Benji

Benj
la source
Vous pensez sérieusement que lire le contenu du fichier sous forme de chaîne puis l'exécuter est une bonne solution lorsque nous avons toutes les autres solutions que les gens ont publiées?
qwr
@qwr Erm oui, je le fais. Beaucoup d'autres réponses ne fonctionnent pas dans certaines situations. C'est pourquoi j'avais besoin d'un moyen simple qui était garanti de fonctionner. Si vous êtes incapable de voir les choses d'un autre point de vue, vous devez essayer d'utiliser l'IDLE officiel.
Benj
0

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

library.zip
|-library
|--__init__.py

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

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

Nous pouvons écrire un autre script qui peut importer un package à partir de l'archive zip. Il est seulement nécessaire d'ajouter le fichier zip au sys.path.

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

import library

def run():
    library.dummy()

run()
Farsheed
la source
quel avantage le fichier zip offre-t-il?
qwr