Instalar mi sdist desde PyPI pone los archivos en lugares inesperados

Mi problema es que cuando subo mi paquete de Python a PyPI y luego lo instalo desde allí usando pip, mi aplicación se rompe porque instala mis archivos en ubicaciones completamente diferentes que cuando instalo exactamente el mismo paquete desde un sdist local.

Instalar desde el sdist local pone archivos en mi sistema de esta manera:

/Python27/ Lib/ site-packages/ gloopy-0.1.alpha-py2.7.egg/ (egg and install info files) data/ (images and shader source) doc/ (html) examples/ (.py scripts that use the library) gloopy/ (source) 

Esto es lo que esperaría, y funciona bien (por ejemplo, mi fuente puede encontrar mi directorio de datos, porque se encuentran uno al lado del otro, como lo hacen en el desarrollo).

Si subo el mismo sdist a PyPI y luego lo instalo desde allí, usando pip, entonces las cosas se ven muy diferentes:

 /Python27/ data/ (images and shader source) doc/ (html) Lib/ site-packages/ gloopy-0.1.alpha-py2.7.egg/ (egg and install info files) gloopy/ (source files) examples/ (.py scripts that use the library) 

Esto no funciona en absoluto: mi aplicación no puede encontrar sus archivos de datos, y obviamente es un desastre, contaminando el directorio de nivel superior / python27 con toda mi basura.

¿Qué estoy haciendo mal? ¿Cómo puedo hacer que la instalación pip se comporte como la instalación sdist local? ¿Es eso lo que debería intentar lograr?

Detalles

He instalado setuptools, y también distribuyo, y estoy llamando a distribution_setup.use_setuptools ()

Windows XP, Python2.7.

Mi directorio de desarrollo se ve así:

 /gloopy /data (image files and GLSL shader souce read at runtime) /doc (html files) /examples (some scripts to show off the library) /gloopy (the library itself) 

Mi MANIFEST.in menciona todos los archivos que quiero que se incluyan en el sdist, incluidos todos los datos, ejemplos y directorios de documentos:

 recursive-include data *.* recursive-include examples *.py recursive-include doc/html *.html *.css *.js *.png include LICENSE.txt include TODO.txt 

Mi setup.py es bastante detallado, pero creo que lo mejor es incluirlo aquí, ¿verdad? También incluyo referencias duplicadas a los mismos directorios data / doc / examples que se mencionan en MANIFEST.in, porque entiendo que esto es necesario para que estos archivos se copien desde el sdist al sistema durante la instalación.

 NAME = 'gloopy' VERSION= __import__(NAME).VERSION RELEASE = __import__(NAME).RELEASE SCRIPT = None CONSOLE = False def main(): import sys from pprint import pprint from setup_utils import distribute_setup from setup_utils.sdist_setup import get_sdist_config distribute_setup.use_setuptools() from setuptools import setup description, long_description = read_description() config = dict( name=name, version=version, description=description, long_description=long_description, keywords='', packages=find_packages(), data_files=[ ('examples', glob('examples/*.py')), ('data/shaders', glob('data/shaders/*.*')), ('doc', glob('doc/html/*.*')), ('doc/_images', glob('doc/html/_images/*.*')), ('doc/_modules', glob('doc/html/_modules/*.*')), ('doc/_modules/gloopy', glob('doc/html/_modules/gloopy/*.*')), ('doc/_modules/gloopy/geom', glob('doc/html/_modules/gloopy/geom/*.*')), ('doc/_modules/gloopy/move', glob('doc/html/_modules/gloopy/move/*.*')), ('doc/_modules/gloopy/shapes', glob('doc/html/_modules/gloopy/shapes/*.*')), ('doc/_modules/gloopy/util', glob('doc/html/_modules/gloopy/util/*.*')), ('doc/_modules/gloopy/view', glob('doc/html/_modules/gloopy/view/*.*')), ('doc/_static', glob('doc/html/_static/*.*')), ('doc/_api', glob('doc/html/_api/*.*')), ], classifiers=[ 'Development Status :: 1 - Planning', 'Intended Audience :: Developers', 'License :: OSI Approved :: BSD License', 'Operating System :: Microsoft :: Windows', 'Programming Language :: Python :: 2.7', ], # see classifiers http://pypi.python.org/pypi?:action=list_classifiers ) config.update(dict( author='Jonathan Hartley', author_email='tartley@tartley.com', url='http://bitbucket.org/tartley/gloopy', license='New BSD', ) ) if '--verbose' in sys.argv: pprint(config) setup(**config) if __name__ == '__main__': main() 

El parámetro data_files es para archivos de datos que no forman parte del paquete. Probablemente deberías usar package_data lugar.

Ver https://pythonhosted.org/setuptools/setuptools.html#including-data-files

Eso no instalaría los datos en los paquetes / datos del sitio, pero en mi opinión no es donde se debe instalar de todos modos. No sabrás de qué paquete es parte. Debe instalarse en site-packages//gloopy-0.1.alpha-py2.7.egg/[data|doc|examples] IMO.

Si realmente crees que los datos no son datos de paquetes, entonces deberías usar data_files y en ese caso pip lo instala correctamente, mientras que reclamo que setup.py install instala en el lugar equivocado. Pero en mi opinión, en este caso, es package_data, ya que está relacionado con el paquete y no es usado por otro software.

Puede cargar los datos del paquete con pkgutil.get_data () , encontrará dónde está instalado exactamente los datos del paquete.

Aquí hay una buena publicación en el blog sobre la inclusión de archivos de datos en paquetes: Incluir archivos de datos en paquetes de Python