J'ai un fichier appelé tester.py
, situé sur /project
.
/project
a un sous-répertoire appelé lib
, avec un fichier appelé BoxTime.py
:
/project/tester.py
/project/lib/BoxTime.py
Je souhaite importer BoxTime
depuis tester
. J'ai essayé ceci:
import lib.BoxTime
Résultat:
Traceback (most recent call last):
File "./tester.py", line 3, in <module>
import lib.BoxTime
ImportError: No module named lib.BoxTime
Des idées sur la façon d'importer à BoxTime
partir du sous-répertoire?
ÉDITER
Le __init__.py
était le problème, mais ne pas oublier de se référer à BoxTime
comme lib.BoxTime
, ou de l' utilisation:
import lib.BoxTime as BT
...
BT.bt_function()
python
module
subdirectory
python-import
Adam Matan
la source
la source
__init__
fichiers stupides codés en dur (mais si vous le souhaitez, enregistrez simplement un crochet de chargement automatique! C'est la différence entre hacky et hackable ).import sys, os; sys.path.insert(0, os.path.abspath('..')); from sibling_package.hacks import HackyHackHack
lib
.lib\__init__.py
.Dans
lib\BoxTime.py
, écrivez une fonctionfoo()
comme celle-ci:Dans votre code client dans le répertoire ci
lib
- dessus , écrivez:Exécutez votre code client. Tu auras:
Beaucoup plus tard - sous Linux, cela ressemblerait à ceci:
la source
lib
Vous pouvez essayer de l'insérer dans
sys.path
:la source
cd /data
,python ../project/tester.py
. Alors ça ne marchera pas.J'écris ceci parce que tout le monde semble suggérer que vous devez créer un
lib
répertoire.Vous n'avez pas besoin de nommer votre sous-répertoire
lib
. Vous pouvez le nommer àanything
condition d'y mettre un__init__.py
.Vous pouvez le faire en entrant la commande suivante dans un shell Linux:
Alors maintenant, vous avez cette structure:
Ensuite , vous pouvez importer
mylib
dansmain.py
comme ceci:Vous pouvez également importer des fonctions et des classes comme celle-ci:
Toute fonction ou classe variable que vous placez à l'intérieur
__init__.py
est également accessible:Ou comme ça:
la source
utils\__init__.py
etutils\myfile.py
. (Les utilitaires contiennent les deux fichiers) Voici comment j'essaie d'importerfrom utils.myfile import myMethod
. Mais je comprendsModuleNotFoundError: No module named 'utils'
. Qu'est-ce qui ne va pas? PS: J'utiliseDjango
et j'essaye d'importer dansviews.py
qui est au même niveau que leutils
dossierPYTHONPATH=. python path/to/program.py
Votre répertoire lib contient-il un
__init__.py
fichier?Python utilise
__init__.py
pour déterminer si un répertoire est un module.la source
Essayez
import .lib.BoxTime
. Pour plus d'informations, lisez l'importation relative dans PEP 328 .la source
Je fais cela qui couvre essentiellement tous les cas (assurez-vous que vous avez
__init__.py
dans le dossier / path / vers / votre / lib / dossier):Exemple:
Vous avez dans votre dossier de projet:
Vous avez dans un autre dossier de projet:
Vous voulez utiliser
/root/anotherproject/utils.py
et appeler la fonction foo qui s'y trouve.Vous écrivez donc dans app.py:
la source
os.path
vous voudrez probablement utiliseros.path.join((os.path.dirname(os.path.realpath(__file__)),'..','anotherproject')
au lieu de coder en dur le «/» dans la concaténation de votre chemin."../anotherproject"
passeros.path.dirname()
?dirname(realpath(__file__))
, alors il calculera le chemin par rapport à votre répertoire de travail actuel lorsque vous exécutez le script, et non par rapport à son emplacement.Créez un fichier vide
__init__.py
dans le sous-répertoire / lib. Et ajoutez au début du code principalpuis
ou mieux
la source
Juste un ajout à ces réponses.
Si vous souhaitez importer tous les fichiers de tous les sous - répertoires , vous pouvez l'ajouter à la racine de votre fichier.
Et puis vous pouvez simplement importer des fichiers à partir des sous-répertoires comme si ces fichiers se trouvaient dans le répertoire courant.
Exemple de travail
Si j'ai le répertoire suivant avec des sous-répertoires dans mon projet ...
Je peux mettre le code suivant dans mon
a.py
fichierEn d'autres termes, ce code fera abstraction du répertoire d'où provient le fichier.
la source
/project/tester.py
/project/lib/BoxTime.py
créer un fichier vierge
__init__.py
sur toute la ligne jusqu'à ce que vous atteigniez le fichier/project/lib/somefolder/BoxTime.py
#lib
- besoins a deux éléments un__init__.py
et un répertoire nommé somefolder#somefolder
a deux élémentsboxtime.py
et__init__.py
la source
essaye ça:
from lib import BoxTime
la source