J'ai la structure de dossiers suivante.
application/app/folder/file.py
et je veux importer certaines fonctions de file.py dans un autre fichier Python qui réside dans
application/app2/some_folder/some_file.py
J'ai essayé
from application.app.folder.file import func_name
et quelques autres tentatives diverses mais jusqu'à présent, je n'ai pas réussi à importer correctement. Comment puis-je faire ceci?
Réponses:
Par défaut, vous ne pouvez pas. Lors de l'importation d'un fichier, Python ne recherche que le répertoire en cours, le répertoire à partir
sys.path
duquel le script du point d'entrée s'exécute, et qui inclut des emplacements tels que le répertoire d'installation du package (c'est en fait un peu plus complexe que cela, mais cela couvre la plupart des cas) .Cependant, vous pouvez ajouter au chemin Python lors de l'exécution:
la source
sys.path.append('/path/to/application/app/folder')
est plus propre imosys.path
renvoie unlist
, pas undeque
, et il serait idiot de convertir lelist
en adeque
et en arrière.Rien de mal avec:
Assurez-vous simplement qu'il
folder
contient également un__init__.py
, cela lui permet d'être inclus en tant que package. Je ne sais pas pourquoi les autres réponses parlentPYTHONPATH
.la source
PYTHONPATH
est nécessaire. Supposons que vous ayez deux dossiers au même niveau:A
etB
.A
a un__init.py__
. Essayez d'importer quelque chose de l'B
intérieurA
.init.py
or__init__.py
?application
etapp
sont déjà des packages (c'est-à-dire que vous en avez déjà__init__.py
dans les deux). À la suite de l'ajout__init__.py
également àfolder
,application.app.folder
devient un (sous) package , à partir duquel vous pouvez accéder au moduleapplication.app.folder.file
, dont le symbolefunc_name
peut maintenant être importéLorsque les modules sont dans des emplacements parallèles, comme dans la question:
Ce raccourci rend un module visible pour l'autre:
la source
sys.path.append(os.path.dirname(os.path.abspath(__file__)))
cli/foo.py
partir de la ligne de commande puisseimport cli.bar
sys.path.append('.')
importation du module à l'aide defrom app2.some_folder.some_file import your_function
. Alternativement, ce qui fonctionne pour moi s'exécute àpython3 -m app2.another_folder.another_file
partir du dossier racine.Premier import sys dans name-file.py
Deuxième append le chemin du dossier dans name-file.py
Troisièmement, créez un fichier vide appelé __ init __.py dans votre sous-répertoire (cela indique à Python qu'il s'agit d'un package)
Quatrièmement, importez le module dans le dossier name-file.py
la source
sys.path.insert
commande-. En tant que tel, la réponse laisse la question, si cette solution fonctionne même lorsque le dossier de noms est situé dans un emplacement arbitraire.Je pense qu'une manière ad-hoc serait d'utiliser la variable d'environnement
PYTHONPATH
comme décrit dans la documentation: Python2 , Python3la source
Les réponses ici manquent de clarté, cela est testé sur Python 3.6
Avec cette structure de dossiers:
Où
myfile.py
a le contenu:L'instruction d'importation dans
main.py
est:et cela imprimera bonjour .
la source
__init__.py
?__init__.py
ne fonctionne pas pour moi. J'utilise Py 3.6.5 sur Ubuntu 18. Il fonctionne sur Pycharm mais pas depuis le terminalVotre problème est que Python recherche ce fichier dans le répertoire Python et ne le trouve pas. Vous devez spécifier que vous parlez du répertoire dans lequel vous vous trouvez et non du répertoire Python.
Pour ce faire, vous changez ceci:
from application.app.folder.file import func_name
pour ça:
En ajoutant le point, vous dites recherchez dans ce dossier le dossier d'application au lieu de chercher dans le répertoire Python.
la source
D'après ce que je sais, ajouter un
__init__.py
fichier directement dans le dossier des fonctions que vous souhaitez importer fera l'affaire.la source
sys.path.append(tools_dir)
sur Windows et je n'ai pas besoin d'ajouter un__init__.py' file in my directory
tools_dir`Dans Python 3.4 et versions ultérieures, vous pouvez importer directement à partir d'un fichier source (lien vers la documentation) . Ce n'est pas la solution la plus simple, mais j'inclus cette réponse pour être complet.
Voici un exemple. Tout d'abord, le fichier à importer, nommé
foo.py
:Le code qui importe le fichier ci-dessus, largement inspiré de l'exemple de la documentation:
Le résultat:
Notez que le nom de variable, le nom de module et le nom de fichier ne doivent pas nécessairement correspondre. Ce code fonctionne toujours:
Le résultat:
L'importation par programme de modules a été introduite dans Python 3.1 et vous donne plus de contrôle sur la façon dont les modules sont importés. Reportez-vous à la documentation pour plus d'informations.
la source
A travaillé pour moi en python3 sur linux
la source
sys.path.append("/home/linux/folder/")
- Assurez-vous de ne pas utiliser de raccourci, par exemple"~/folder/"
Essayez les importations relatives de Python:
Chaque point de tête est un autre niveau supérieur de la hiérarchie commençant par le répertoire courant.
Problèmes? Si cela ne fonctionne pas pour vous, vous obtenez probablement peu par les nombreuses importations relatives de gotcha. Lisez les réponses et les commentaires pour plus de détails: Comment corriger «Tentative d'importation relative dans un non-package» même avec __init__.py
Astuce: avoir
__init__.py
à chaque niveau de répertoire. Vous pourriez avoir besoinpython -m application.app2.some_folder.some_file
(en laissant .py) que vous exécutez à partir du répertoire de niveau supérieur ou avoir ce répertoire de niveau supérieur dans votre PYTHONPATH. Phew!la source
J'ai été confronté au même défi, en particulier lors de l'importation de plusieurs fichiers, c'est ainsi que j'ai réussi à le surmonter.
la source
Considérant
application
que le répertoire racine de votre projet python, créer un vide__init__.py
fichierapplication
,app
et desfolder
dossiers. Ensuite, dans vossome_file.py
modifications, procédez comme suit pour obtenir la définition de func_name:la source
L'utilisation de sys.path.append avec un chemin absolu n'est pas idéale lors du déplacement de l'application vers d'autres environnements. L'utilisation d'un chemin relatif ne fonctionnera pas toujours car le répertoire de travail actuel dépend de la façon dont le script a été appelé.
La structure du dossier d'application étant fixe, nous pouvons utiliser os.path pour obtenir le chemin complet du module que nous souhaitons importer. Par exemple, si c'est la structure:
Et disons que vous souhaitez importer le module "mango". Vous pouvez faire ce qui suit dans vanilla.py:
Bien sûr, vous n'avez pas besoin de la variable mango_dir.
Pour comprendre comment cela fonctionne, regardez cet exemple de session interactive:
Et consultez la documentation os.path .
la source
Cela fonctionne pour moi sur Windows
la source
Je suis assez spécial: j'utilise Python avec Windows!
Je viens de compléter les informations: pour Windows et Linux, les chemins relatifs et absolus fonctionnent
sys.path
(j'ai besoin de chemins relatifs car j'utilise mes scripts sur plusieurs PC et sous différents répertoires principaux).Et lorsque vous utilisez Windows à la fois
\
et/
pouvez être utilisé comme séparateur pour les noms de fichiers et bien sûr, vous devez doubler\
en chaînes Python,quelques exemples valides:
(note: je pense que
/
c'est plus pratique que\
, événement s'il est moins «natif de Windows» car il est compatible Linux et plus simple à écrire et à copier dans l'explorateur Windows)la source
Si le but du chargement d'un module à partir d'un chemin spécifique est de vous aider lors du développement d'un module personnalisé, vous pouvez créer un lien symbolique dans le même dossier du script de test qui pointe vers la racine du module personnalisé. Cette référence de module aura priorité sur tous les autres modules installés du même nom pour tout script exécuté dans ce dossier.
J'ai testé cela sur Linux mais cela devrait fonctionner dans n'importe quel système d'exploitation moderne qui prend en charge les liens symboliques.
Un avantage de cette approche est que vous pouvez pointer vers un module qui se trouve dans votre propre copie de travail de branche SVC locale, ce qui peut considérablement simplifier le temps de cycle de développement et réduire les modes de défaillance de la gestion des différentes versions du module.
la source
Dans mon cas, j'avais une classe à importer. Mon fichier ressemblait à ceci:
Dans mon fichier principal, j'ai inclus le code via:
la source
Je suis tombé sur la même question plusieurs fois, alors je voudrais partager ma solution.
Version Python: 3.X
La solution suivante est destinée à quelqu'un qui développe votre application dans Python version 3.X car Python 2 n'est pas pris en charge depuis le 1er janvier 2020 .
Structure du projet
En python 3, vous n'avez pas besoin
__init__.py
dans votre sous-répertoire de projet en raison des packages d'espace de noms implicites . Voir Is init .py n'est pas requis pour les packages en Python 3.3+Énoncé du problème
Dans
file_b.py
, je voudrais importer une classeA
dansfile_a.py
le dossier a.Solutions
# 1 Un moyen rapide mais sale
Sans installer le package comme vous développez actuellement un nouveau projet
Utiliser le
try catch
pour vérifier si les erreurs. Exemple de code:# 2 Installez votre package
Une fois que vous avez installé votre application (dans cet article, le tutoriel d'installation n'est pas inclus)
Vous pouvez simplement
Bon codage!
la source
Je travaillais sur un projet
a
que je voulais que les utilisateurs installent viapip install a
avec la liste de fichiers suivante:setup.py
MANIFEST.in
a / init .py
a / a.py
a / b / init .py
a / b / b.py
J'ai installé le module en exécutant ce qui suit à partir du répertoire avec
MANIFEST.in
:Ensuite, à partir d'un emplacement totalement différent sur mon système de fichiers,
/moustache/armwrestle
j'ai pu exécuter:Ce qui a confirmé
a.cats
qu'effectivement égal à 0 eta.b.dogs
effectivement égal à 1, comme prévu.la source
Au lieu de simplement faire un
import ...
, faites ceci:from <MySubFolder> import <MyFile>
MyFile est à l'intérieur de MySubFolder.
la source
Vous pouvez actualiser le shell Python en appuyant sur f5, ou allez dans Exécuter-> Exécuter le module. De cette façon, vous n'avez pas à modifier le répertoire pour lire quelque chose dans le fichier. Python changera automatiquement le répertoire. Mais si vous souhaitez travailler avec différents fichiers d'un répertoire différent dans le shell Python, vous pouvez modifier le répertoire dans sys, comme Cameron l'a dit plus tôt.
la source
Je venais donc de cliquer avec le bouton droit de la souris sur mon IDE et d'en ajouter un nouveau
folder
et je me demandais pourquoi je ne pouvais pas importer à partir de celui-ci. Plus tard, j'ai réalisé que je devais faire un clic droit et créer un package Python, et non un dossier de système de fichiers classique. Ou une méthode post-mortem consistant à ajouter un__init__.py
(ce qui fait que python traite le dossier du système de fichiers comme un package) comme mentionné dans d'autres réponses. Ajouter cette réponse ici juste au cas où quelqu'un emprunterait cette voie.la source
Vous pouvez utiliser importlib pour importer des modules où vous souhaitez importer un module à partir d'un dossier à l'aide d'une chaîne comme ceci:
Cet exemple a un main.py qui est le code ci-dessus puis un dossier appelé Scripts et vous pouvez ensuite appeler ce dont vous avez besoin à partir de ce dossier en changeant la
scriptName
variable. Vous pouvez ensuite utiliserscript
pour faire référence à ce module. comme si j'ai une fonction appeléeHello()
dans le module Snake, vous pouvez exécuter cette fonction en le faisant:J'ai testé cela en Python 3.6
la source
J'ai eu ces problèmes plusieurs fois. Je suis souvent venu sur cette même page. Dans mon dernier problème, j'ai dû exécuter le à
server
partir d'un répertoire fixe, mais chaque fois que le débogage je voulais exécuter à partir de différents sous-répertoires.n'a PAS fonctionné pour moi car à différents modules j'ai dû lire différents fichiers * .csv qui étaient tous dans le même répertoire.
En fin de compte, ce qui a fonctionné pour moi n'était pas pythonique, je suppose, mais:
J'ai utilisé un
if __main__
sur le module que je voulais déboguer , qui est exécuté à partir d'un chemin différent de celui habituel.Donc:
la source