Comment importer d'autres fichiers en Python?
import file.py
?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
?
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.
Juste import file
sans l'extension '.py'.
Vous pouvez marquer un dossier en tant que package en ajoutant un fichier vide nommé __init__.py
.
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.
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:
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, 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:
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()
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 ...:
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 ç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é
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 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:
/home/el/foo5/
/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éer un nouveau répertoire/home/el/foo5/herp/derp
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
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!!"
Le moment de vérité, faites le nouveau fichier /home/el/foo5/main.py
, mettez ceci 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 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
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
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
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
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.
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.
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
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
Vous pouvez inclure votre script python avec le nom abc.py de deux manières différentes.
importer abc
depuis l'import de dossier abc
depuis folder.internal_folder import abc
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
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.
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.
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()
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
.
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 .
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
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)
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.
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.