8

私の問題は、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 は、data、examples、および doc ディレクトリ内のすべてを含む、sdist に含めたいすべてのファイルについて言及しています。

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

私の setup.py は非常に冗長ですが、ここに含めるのが最善だと思いますよね? インストール中にこれらのファイルを sdist からシステムにコピーするには、これが必要であることを理解しているため、MANIFEST.in に記載されているものと同じ data / doc / examples ディレクトリへの重複参照も含めます。

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

2 に答える 2

7

data_filesパラメータは、パッケージの一部ではないデータ ファイル用です。package_dataおそらく代わりに使用する必要があります。

https://docs.python.org/3/distutils/setupscript.html#installing-package-dataを参照してください

それは site-packages/data にデータをインストールしませんが、私の意見では、とにかくインストールする必要がある場所ではありません。どのパッケージに含まれているかわかりません。site-packages//gloopy-0.1.alpha-py2.7.egg/[data|doc|examples]IMOにインストールする必要があります。

データがパッケージ データではないと本当に思う場合は、使用する必要がdata_filesあります。その場合、pip はそれを正しくsetup.py installインストールしますが、間違った場所にインストールすると主張します。しかし、私の意見では、この場合、それは package_data であり、パッケージに関連しており、他のソフトウェアでは使用されていません。

于 2011-03-04T12:09:25.727 に答える
-1

パッケージ データはpkgutil.get_data()でロードできます。パッケージ データがインストールされている場所が正確にわかります。

パッケージにデータ ファイルを含めることについては、次のブログ記事を参照してください。Python パッケージにデータ ファイルを含める

于 2011-03-04T11:40:49.620 に答える