[Distutils] buildout/setuptools slow as it scans the whole project dir
Reinout van Rees
reinout at vanrees.org
Wed Apr 15 16:01:13 CEST 2015
Hi,
In some of my projects, buildout takes a looooooong time to complete.
Sometimes the same problem occurs on the server or on another
developer's laptop, sometimes not. The difference is something like "15
seconds if there's no problem" and "5 minutes if the problem occurs".
It is terribly hard to pinpoint the exact problem and/or cause. An error
in the setup.py or or MANIFEST.in is unlikely, as the very same project
might take 5 minutes locally and 15 seconds on the server or vice versa...
Anyway, if I run "bin/buildout" as "strace -f bin/buildout", I see a lot
of "stat" calls. Setuptools walks through all the files inside my
project dir. Including parts/omelette/* and, if available, a
bower_compontents/ directory full of thousands of javascript files.
Removing some of these directories (which running the buildout
re-creates) fixes the speed issue for one run.
I modified my local buildout copy to run "setup.py develop" with a -v
instead of a -q option. This way I found out where it approximately happens:
/usr/bin/python /tmp/tmp6UdsMl -v develop -mxN -d
/vagrant/sso/develop-eggs/tmpfioc1Ibuild
running develop
running egg_info
writing requirements to sso.egg-info/requires.txt
writing sso.egg-info/PKG-INFO
writing top-level names to sso.egg-info/top_level.txt
writing dependency_links to sso.egg-info/dependency_links.txt
writing entry points to sso.egg-info/entry_points.txt
### This is where the process seems to stop a couple of minutes to scan
all the files.
reading manifest file 'sso.egg-info/SOURCES.txt'
reading manifest template 'MANIFEST.in'
writing manifest file 'sso.egg-info/SOURCES.txt'
running build_ext
Creating /vagrant/sso/develop-eggs/tmpfioc1Ibuild/sso.egg-link (link to .)
The MANIFEST.in loooks like this:
# Include docs in the root.
include *.rst
# Include everything in our project directory (sso/views.py,
sso/static/some.js, etc)
graft sso
It is a git project. The setup.py looks like this:
from setuptools import setup
version = '1.1.dev0'
long_description = '\n\n'.join([
open('README.rst').read(),
open('CREDITS.rst').read(),
open('CHANGES.rst').read(),
])
install_requires = [
'Django >= 1.4.2, < 1.7',
'django-nose',
'lizard-auth-server',
'gunicorn',
'raven',
'werkzeug',
'south',
'django-auth-ldap',
'django-mama-cas',
],
setup(name='sso',
version=version,
description="Single sign on server (and more) for lizard",
long_description=long_description,
# Get strings from
http://www.python.org/pypi?%3Aaction=list_classifiers
classifiers=['Programming Language :: Python',
'Framework :: Django',
],
keywords=[],
author='Do not blame Reinout',
author_email='reinout.vanrees at nelen-schuurmans.nl',
url='',
license='GPL',
packages=['sso'],
zip_safe=False,
install_requires=install_requires,
entry_points={
'console_scripts': [
]},
)
Conclusion for me: something somewhere in setuptools is reading my whole
project folder. It does it after "writing entry points to
sso.egg-info/entry_points.txt" and before "reading manifest file
'sso.egg-info/SOURCES.txt'". The SOURCES.txt itself is small:
CHANGES.rst
CREDITS.rst
LICENSE.rst
MANIFEST.in
README.rst
setup.cfg
setup.py
sso/__init__.py
sso/__init__.pyc
sso/admin.py
sso/developmentsettings.py
sso/developmentsettings.pyc
sso/models.py
sso/models.pyc
sso/settings.py
sso/settings.pyc
sso/stagingsettings.py
sso/tests.py
sso/urls.py
sso/views.py
sso.egg-info/PKG-INFO
sso.egg-info/SOURCES.txt
sso.egg-info/dependency_links.txt
sso.egg-info/entry_points.txt
sso.egg-info/not-zip-safe
sso.egg-info/requires.txt
Hm. I see some .pyc files in there. Something that needs fixing, but not
the cause, I think.
Is there something I'm missing? Where should I look? I cannot find
"writing entry points to..." in the setuptools source code right away.
Reinout
--
Reinout van Rees http://reinout.vanrees.org/
reinout at vanrees.org http://www.nelen-schuurmans.nl/
"Learning history by destroying artifacts is a time-honored atrocity"
More information about the Distutils-SIG
mailing list