J'utilise Python 3.5.1. J'ai lu le document et la section paquet ici: https://docs.python.org/3/tutorial/modules.html#packages
Maintenant, j'ai la structure suivante:
/home/wujek/Playground/a/b/module.py
module.py
:
class Foo:
def __init__(self):
print('initializing Foo')
Maintenant, en /home/wujek/Playground
:
~/Playground $ python3
>>> import a.b.module
>>> a.b.module.Foo()
initializing Foo
<a.b.module.Foo object at 0x100a8f0b8>
De même, maintenant à la maison, super-titulaire de Playground
:
~ $ PYTHONPATH=Playground python3
>>> import a.b.module
>>> a.b.module.Foo()
initializing Foo
<a.b.module.Foo object at 0x10a5fee10>
En fait, je peux faire toutes sortes de choses:
~ $ PYTHONPATH=Playground python3
>>> import a
>>> import a.b
>>> import Playground.a.b
Pourquoi ça marche? Je pensais qu'il fallait que __init__.py
(des fichiers vides fonctionneraient) dans a
et b
pour module.py
pour pouvoir être importé lorsque le chemin Python pointe vers le dossier Playground
?
Cela semble avoir changé de Python 2.7:
~ $ PYTHONPATH=Playground python
>>> import a
ImportError: No module named a
>>> import a.b
ImportError: No module named a.b
>>> import a.b.module
ImportError: No module named a.b.module
Avec __init__.py
dans ~/Playground/a
et ~/Playground/a/b
, tout fonctionne correctement.
Python 3.3+ a packages de noms implicites qui lui permettent de créer des packages sans fichier __init__.py
.
Autoriser les packages d'espaces de noms implicites signifie que l'obligation de fournir un fichier
__init__.py
peut être complètement supprimée et affectée ....
L'ancienne méthode avec les fichiers __init__.py
fonctionne toujours comme dans Python 2.
IMPORTANT
@ La réponse de Mike est correcte mais trop imprécise. Il est vrai que Python 3.3+ prend en charge des packages d'espace de noms implicite qui lui permettent de créer un package sans fichier ___init__.py
_.
Toutefois, cela s’applique UNIQUEMENT aux fichiers EMPTY ___init__.py
_ . Ainsi, les fichiers VIDE ___init__.py
_ ne sont plus nécessaires et peuvent être omis. Si vous souhaitez exécuter un script d'initialisation particulier lorsque le package ou l'un de ses modules ou sous-packages sont importés, vous avez toujours besoin d'un __init__.py
fichier. C’est un excellent réponse au débordement de pile pour savoir pourquoi vous voudriez utiliser un fichier ___init__.py
_ pour procéder à une autre initialisation au cas où vous vous demanderiez pourquoi cela est utile.
Exemple de structure de répertoire:
_ parent_package/
__init__.py <- EMPTY, NOT NECESSARY in Python 3.3+
child_package/
__init__.py <- STILL REQUIRED if you want to run an initialization script
child1.py
child2.py
child3.py
_
_parent_package/child_package/__init__.py
_:
_print("from parent")
_
EXEMPLES
Les exemples ci-dessous montrent comment le script d'initialisation est exécuté lorsque le _child_package
_ ou l'un de ses modules est importé.
Exemple 1 :
_from parent_package import child_package # prints "from parent"
_
Exemple 2 :
_from parent_package.child_package import child1 # prints "from parent"
_
si vous avez setup.py
et que vous utilisez find_packages()
, il est nécessaire d'avoir __init__.py
dans chaque répertoire pour que les paquets soient automatiquement trouvés.
Les packages ne sont reconnus que s'ils incluent un fichier
__init__.py
Je dirais que l'on ne devrait omettre le __init__.py
que si l'on veut avoir le paquet d'espace de noms implicite . Si vous ne savez pas ce que cela signifie, vous n'en voudrez probablement pas et vous devriez donc continuer à utiliser le __init__.py
même dans Python 3.