Je suis totalement nouveau à Python et je sais que cette question a été posée plusieurs fois, mais malheureusement, il semble que ma situation soit un peu différente ... J'ai créé un package (ou alors je pense L'arborescence du catalogue est la suivante:
mydir
lib (__init__.py)
mod1 (__init__.py, mod11.py)
Entre parenthèses, il y a des fichiers dans le catalogue. Les deux fichiers __init__.py
Ont une longueur nulle. Le fichier mydir/lib/mod1/mod11.py
Contient les éléments suivants:
def mod12():
print "mod12"
Maintenant, je lance python
, puis import lib
, Ce qui fonctionne bien, puis lib.mod11()
ou lib.mod12()
. L'un des deux derniers me donne le message d'erreur sujet. En fait, dir(lib)
après l'étape 2 n'affiche pas non plus mod11
Ou mod12
. Il semble que je manque quelque chose de vraiment simple. (J'utilise Python 2.6 dans Ubuntu 10.10)
Merci
Lorsque vous import lib
, Vous importez le package. Le seul fichier à évaluer et à exécuter dans ce cas est le 0 octet __init__.py
Dans le répertoire lib.
Si vous voulez accéder à votre fonction, vous pouvez faire quelque chose comme ceci from lib.mod1 import mod1
Puis exécuter la fonction mod12
Comme si mod1.mod12()
.
Si vous souhaitez pouvoir accéder à mod1
Lorsque vous importez lib
, vous devez placer un import mod1
Dans le fichier __init__.py
À l'intérieur du lib
répertoire.
Plus précisément, vos répertoires mod1
Et lib
ne sont pas des modules, ce sont des packages. Le fichier mod11.py
Est un module.
Python n'importe pas automatiquement les sous-packages ou modules. Vous devez le faire explicitement, ou "tricher" en ajoutant des instructions d'importation dans les initialiseurs.
>>> import lib
>>> dir(lib)
['__builtins__', '__doc__', '__file__', '__name__', '__package__', '__path__']
>>> import lib.pkg1
>>> import lib.pkg1.mod11
>>> lib.pkg1.mod11.mod12()
mod12
Une alternative consiste à utiliser la syntaxe from
pour "extraire" un module d'un package dans votre espace de noms de scripts.
>>> from lib.pkg1 import mod11
Référencez ensuite la fonction simplement mod11.mod12()
.
La façon dont je le ferais est de laisser les fichiers __ init__.py vides, et de faire:
import lib.mod1.mod11
lib.mod1.mod11.mod12()
ou
from lib.mod1.mod11 import mod12
mod12()
Vous pouvez trouver que le répertoire mod1 n'est pas nécessaire, il suffit d'avoir mod12.py dans lib.
Ma solution est de mettre ces importations dans __init__.py
de lib:
in file: __init__.py
import mod1
Ensuite,
import lib
lib.mod1
fonctionnerait bien.