首页 文章

如何使用setuptools / distribute包含包数据?

提问于
浏览
104

使用setuptools / distribute时,我无法让安装程序提取任何package_data文件 . 我读过的所有内容都表明以下是正确的方法 . 有人可以建议吗?

setup(
   name='myapp',
   packages=find_packages(),
   package_data={
      'myapp': ['data/*.txt'],
   },
   include_package_data=True,
   zip_safe=False,
   install_requires=['distribute'],
)

其中 myapp/data/ 是数据文件的位置 .

8 回答

  • 10

    我意识到这是一个老问题......但是对于那些通过谷歌找到方法的人来说: package_data 是一个低调的,dirty lie . 它仅在构建二进制包( python setup.py bdist ... )时使用,但在构建源包( python setup.py sdist ... )时不使用 . 当然,这是荒谬的 - 人们会期望构建源代码分发会导致可以发送给其他人构建二进制分发的文件集合 .

    在任何情况下,使用MANIFEST.in都可以用于二进制和源代码分发 .

  • 0

    我刚才有同样的问题 . 解决方案,只是删除 include_package_data=True .

    reading here之后,我意识到 include_package_data 旨在包含来自 version control 的文件,而不仅仅是"include package data",顾名思义 . 来自文档:

    [include_package_data]的数据文件必须在CVS或Subversion控件下...如果您希望对包含的文件进行更细粒度的控制(例如,如果您的包目录中有文档文件并希望将它们从安装中排除),那么你也可以使用package_data关键字 .

    把这个论点修正了,这恰巧是为什么当你切换到distutils时它也起作用,因为它没有采取这个论点 .

  • 3

    以下@Joe建议删除 include_package_data=True 也对我有用 .

    为了详细说明,我有 no MANIFEST.in 文件 . 我使用Git而不是CVS .

    存储库采用这种形式:

    /myrepo
        - .git/
        - setup.py
        - myproject
            - __init__.py
            - some_mod
                - __init__.py
                - animals.py
                - rocks.py
            - config
                - __init__.py
                - settings.py
                - other_settings.special
                - cool.huh
                - other_settings.xml
            - words
                - __init__.py
                word_set.txt
    

    setup.py

    from setuptools import setup, find_packages
    import os.path
    
    setup (
        name='myproject',
        version = "4.19",
        packages = find_packages(),  
        # package_dir={'mypkg': 'src/mypkg'},  # didnt use this.
        package_data = {
            # If any package contains *.txt or *.rst files, include them:
            '': ['*.txt', '*.xml', '*.special', '*.huh'],
        },
    
    #
        # Oddly enough, include_package_data=True prevented package_data from working.
        # include_package_data=True, # Commented out.
        data_files=[
    #               ('bitmaps', ['bm/b1.gif', 'bm/b2.gif']),
            ('/opt/local/myproject/etc', ['myproject/config/settings.py', 'myproject/config/other_settings.special']),
            ('/opt/local/myproject/etc', [os.path.join('myproject/config', 'cool.huh')]),
    #
            ('/opt/local/myproject/etc', [os.path.join('myproject/config', 'other_settings.xml')]),
            ('/opt/local/myproject/data', [os.path.join('myproject/words', 'word_set.txt')]),
        ],
    
        install_requires=[ 'jsonschema',
            'logging', ],
    
         entry_points = {
            'console_scripts': [
                # Blah...
            ], },
    )
    

    我为源发送器运行 python setup.py sdist (尚未尝试二进制) .

    当在一个全新的虚拟环境中,我有一个 myproject-4.19.tar.gz ,文件,我使用

    (venv) pip install ~/myproject-4.19.tar.gz
    ...
    

    除了安装到我的虚拟环境 site-packages 的所有内容之外,这些特殊数据文件安装到 /opt/local/myproject/data/opt/local/myproject/etc .

  • 23

    include_package_data=True 为我工作 .

    如果您使用git,请记住在 install_requires 中包含 setuptools-git . 比 Manifest 或包含 package_data 中的所有路径(在我的情况下它是一个带有各种静态的django应用程序)更不无聊

    (粘贴我发表的评论,因为k3-rnc提到它实际上是有帮助的)

  • 222

    Update :此答案陈旧,信息不再有效 . 所有setup.py配置都应使用 import setuptools . 我在https://stackoverflow.com/a/49501350/64313添加了更完整的答案


    我通过切换到distutils来解决这个问题 . 看起来分布已被弃用和/或破坏 .

    from distutils.core import setup
    
    setup(
       name='myapp',
       packages=['myapp'],
       package_data={
          'myapp': ['data/*.txt'],
       },
    )
    
  • 15

    古老的问题然而......蟒蛇的包管理确实有很多不足之处 . 所以我有一个使用pip本地安装到指定目录的用例,并且很惊讶package_data和data_files路径都没有用完 . 我并不热衷于在repo中添加另一个文件,所以我最终利用了data_files和setup.py选项--install-data;这样的事情

    pip install . --install-option="--install-data=$PWD/package" -t package
    
  • 0

    将包含数据包的文件夹移动到模块文件夹中解决了我的问题 .

    看到这个问题:MANIFEST.in ignored on "python setup.py install" - no data files installed?

  • 4

    这几天我遇到了同样的问题,但即便是这个线程对我来说也不清楚 . 一切都让人困惑 . 所以我做了我的研究并找到了解决方案 . 基本上在这种情况下,这是你应该做的:

    from setuptools import setup
    
    setup(
       name='myapp',
       packages=['myapp'],
       package_dir={'myapp':'myapp'}, # the one line where all the magic happens
       package_data={
          'myapp': ['data/*.txt'],
       },
    )
    

    The full other stackoverflow answer here

相关问题