Установка моего sdist из PyPI помещает файлы в неожиданные места - PullRequest
6 голосов
/ 04 марта 2011

Моя проблема в том, что когда я загружаю свой пакет Python в PyPI, а затем устанавливаю его оттуда с помощью pip, мое приложение разрывается, потому что оно устанавливает мои файлы в совершенно разные места, чем когда я просто устанавливаю точно такой же пакет из локального sdist .

Установка из локального sdist помещает файлы в мою систему следующим образом:

/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)

Это очень много, как я и ожидал, и работает нормально (например, мой источник может найти мою папку данных, потому что они лежат рядом друг с другом, так же, как и в процессе разработки.)

Если я загружаю тот же sdist в PyPI и затем устанавливаю его оттуда, используя pip, то все выглядит совсем иначе:

/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)

Это не работает вообще - мое приложение не может найти свои файлы данных, плюс, очевидно, это беспорядок, загрязняющий каталог верхнего уровня / python27 всем моим мусором.

Что я делаю не так? Как заставить установку pip вести себя как локальная установка sdist? Это даже то, чего я должен пытаться достичь?

Подробнее

У меня установлены setuptools, а также распространяются, и я вызываю Distribute_setup.use_setuptools ()

WindowsXP, Python2.7.

Моя директория разработки выглядит так:

/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)

В моем файле MANIFEST.in упоминаются все файлы, которые я хочу включить в sdist, включая все в данных, примерах и каталогах документов:

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

Мой setup.py довольно многословен, но я думаю, что лучше всего включить его здесь, верно? Я также включаю дубликаты ссылок на те же каталоги data / doc / examples, которые упомянуты в MANIFEST.in, потому что я понимаю, что это необходимо для того, чтобы эти файлы были скопированы из sdist в систему во время установки.

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()

Ответы [ 2 ]

4 голосов
/ 04 марта 2011

Параметр data_files предназначен для файлов данных, которые не входят в пакет.Вы, вероятно, должны использовать package_data.

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

Это не установит данные в site-packages / data, но, по моему мнению, это не то место, где должно быть установленотем не мение.Вы не будете знать, в какую упаковку он входит.Он должен быть установлен в site-packages//gloopy-0.1.alpha-py2.7.egg/[data|doc|examples] IMO.

Если вы действительно считаете, что данные не являются данными пакета, вам следует использовать data_files, и в этом случае pip установит его правильно, а я бы сказал setup.py install устанавливает его не в том месте.Но, на мой взгляд, в данном случае это package_data, поскольку он связан с пакетом и не используется другим программным обеспечением.

0 голосов
/ 04 марта 2011

Вы можете загрузить данные пакета с помощью pkgutil.get_data () , он найдет, где именно установлены данные пакета.

Вот хороший пост в блоге о включении файлов данных в пакеты: Включение файлов данных в пакеты Python

...