1. philip_thiem
  2. setuptools


Jason R. Coombs  committed faba785 Merge

Merge backout of namespace package __init__ module generation; ref #148.

  • Participants
  • Parent commits 50677a0, ced5173
  • Branches default
  • Tags 3.0b1

Comments (0)

Files changed (2)

File CHANGES.txt

View file
   handled properly at runtime.  In 2.x it was possible to get away without
   including the declaration, but only at the cost of forcing namespace
   packages to be imported early, which 3.0 no longer does.
+* Issue #148: When building (bdist_egg), setuptools no longer adds
+  ``__init__.py`` files to namespace packages. Any packages that rely on this
+  behavior will need to create ``__init__.py`` files and include the
+  ``declare_namespace()``.
 * Issue #7: Setuptools itself is now distributed as a zip archive in addition to
   tar archive. ez_setup.py now uses zip archive. This approach avoids the potential
   security vulnerabilities presented by use of tar archives in ez_setup.py.

File setuptools/command/bdist_egg.py

View file
-# stub __init__.py for packages distributed without one
-NS_PKG_STUB = '__import__("pkg_resources").declare_namespace(__name__)'
 class bdist_egg(Command):
             ext_outputs[p] = ext_name.replace(os.sep,'/')
-        to_compile.extend(self.make_init_files())
         if to_compile:
         if self.distribution.data_files:
         log.warn("zip_safe flag not set; analyzing archive contents...")
         return analyze_egg(self.bdist_dir, self.stubs)
-    def make_init_files(self):
-        """Create missing package __init__ files"""
-        init_files = []
-        for base,dirs,files in walk_egg(self.bdist_dir):
-            if base==self.bdist_dir:
-                # don't put an __init__ in the root
-                continue
-            for name in files:
-                if name.endswith('.py'):
-                    if '__init__.py' not in files:
-                        pkg = base[len(self.bdist_dir)+1:].replace(os.sep,'.')
-                        if self.distribution.has_contents_for(pkg):
-                            log.warn("Creating missing __init__.py for %s",pkg)
-                            filename = os.path.join(base,'__init__.py')
-                            if not self.dry_run:
-                                f = open(filename,'w'); f.write(NS_PKG_STUB)
-                                f.close()
-                            init_files.append(filename)
-                    break
-            else:
-                # not a package, don't traverse to subdirectories
-                dirs[:] = []
-        return init_files
     def gen_header(self):
         epm = EntryPoint.parse_map(self.distribution.entry_points or '')