[python] Importer des fichiers de différents dossiers



Answers

Rien de mal avec:

from application.app.folder.file import func_name

Assurez-vous simplement que le dossier contient également un __init__.py , cela lui permet d'être inclus en tant que paquet. Je ne sais pas pourquoi les autres réponses parlent de PYTHONPATH.

Question

J'ai la structure de dossier suivante.

application/app/folder/file.py

et je veux importer certaines fonctions de fichier.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, mais je n'ai pas réussi à importer correctement. Comment puis-je faire ceci?




Dans mon cas, j'avais une classe à importer. Mon fichier ressemblait à ceci:

# /opt/path/to/code/log_helper.py
class LogHelper:
    # stuff here

Dans mon fichier principal, j'ai inclus le code via:

path.append("/opt/path/to/code/")
from log_helper import LogHelper



L'utilisation de sys.path.append avec un chemin absolu n'est pas idéale lorsque vous déplacez l'application vers d'autres environnements. L'utilisation d'un chemin relatif ne fonctionne pas toujours car le répertoire de travail en cours dépend de l'exécution du script.

Puisque la structure du dossier de l'application est fixe, nous pouvons utiliser os.path pour obtenir le chemin complet. Par exemple, si c'est la structure:

/home/me/application/app2/some_folder/vanilla.py
/home/me/application/app2/another_folder/mango.py

Et disons que vous voulez importer le module "mangue". Vous pourriez faire ce qui suit dans vanilla.py:

import sys, os.path
mango_dir = (os.path.abspath(os.path.join(os.path.dirname(__file__), '..'))
+ '/another_folder/')
sys.path.append(mango_dir)
import mango

Bien sûr, vous n'avez pas besoin de la variable mango_dir.

Pour comprendre comment cela fonctionne, regardez cet exemple de session interactive:

>>> import os
>>> mydir = '/home/me/application/app2/some_folder'
>>> newdir = os.path.abspath(os.path.join(mydir, '..'))
>>> newdir
    '/home/me/application/app2'
>>> newdir = os.path.abspath(os.path.join(mydir, '..')) + '/another_folder'
>>> 
>>> newdir
'/home/me/application/app2/another_folder'
>>> 

Et vérifiez la documentation de os.path .







En considérant l' application comme répertoire racine pour votre projet python, créez un fichier __init__.py vide __init__.py dossiers d' application , d' app et de folder . Puis, dans votre some_file.py effectuez les modifications suivantes pour obtenir la définition de func_name:

import sys
sys.path.insert(0, r'/from/root/directory/application')

from application.app.folder.file import func_name ## You can also use '*' wildcard to import all the functions in file.py file.
func_name()



Je suis assez spécial: j'utilise Python avec Windows!

Je viens de compléter l'information: pour Windows et Linux, le chemin relatif et le chemin absolu fonctionnent dans 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, \ et / peuvent être utilisés comme séparateur pour les noms de fichiers et bien sûr vous devez doubler \ en chaînes Python,
quelques exemples valables:

sys.path.append('c:\\tools\\mydir')
sys.path.append('..\\mytools')
sys.path.append('c:/tools/mydir')
sys.path.append('../mytools')

(note: je pense que / est plus pratique que \ , événement s'il est moins 'natif de Windows' parce qu'il est compatible avec Linux et plus simple à écrire et à copier dans l'explorateur Windows)




Votre problème est que Python cherche dans le répertoire Python pour ce fichier et ne le trouve pas. Vous devez spécifier que vous parlez du répertoire dans lequel vous êtes et non du répertoire Python.

Pour ce faire, vous changez ceci:

from application.app.folder.file import func_name

pour ça:

from .application.app.folder.file import func_name

En ajoutant le point que vous dites regardez dans ce dossier pour le dossier de l'application au lieu de chercher dans le répertoire Python.




Cela fonctionne pour moi sur Windows

# some_file.py on mainApp/app2 
import sys
sys.path.insert(0, sys.path[0]+'\\app2')

import some_file



Related