2016-12-17 3 views
1

PEP420 macht __init__.py Dateien optional: https://docs.python.org/3/whatsnew/3.3.html#pep-420-implicit-namespace-packages__init__.py erforderlich für pkgutil.walk_packages in python3?

Obwohl es ohne sie scheint, ist pkgutil.walk_packages nicht wie gewünscht funktionieren: https://docs.python.org/3/library/pkgutil.html#pkgutil.walk_packages

Betrachten Sie das folgende Beispiel:

$ tree foo 
foo 
├── bar 
│   ├── baz.py 
│   └── __init__.py 
├── __init__.py 
└── womp.py 

Und ein Testskript

# test.py 
import pkgutil 

import foo 


for _, mod, _ in pkgutil.walk_packages(foo.__path__, foo.__name__ + '.'): 
    print(mod) 

In beiden Python 2 und python3 ich folgende Ausgabe:

$ python2.7 test.py 
foo.bar 
foo.bar.baz 
foo.womp 
$ python3.5 test.py 
foo.bar 
foo.bar.baz 
foo.womp 

Entfernen der __init__.py Dateien und nur mit python3, bekomme ich diese:

$ find -name '__init__.*' -delete 
$ python3.5 test.py 
foo.bar 

Die Module definitiv importierbar sind:

$ python3.5 -c 'import foo.bar.baz' 
$ 

Ist das ein Fehler? Bin ich gezwungen, die __init__.py Dateien zu erstellen, um zu erreichen, was ich will?

Antwort

0

Als Workaround (vielleicht hilft dies jemand anderen), verwende ich so etwas. Es ist nicht perfekt (gebrochen, wenn pwd ändert oder wenn die Pakete nicht verwurzelt sind.), Aber es tut, was ich für meinen einfachen Anwendungsfall tun möchte: