setuptools: package data folder location

前端 未结 3 1306
死守一世寂寞
死守一世寂寞 2020-11-27 11:04

I use setuptools to distribute my python package. Now I need to distribute additional datafiles.

From what I\'ve gathered fromt the setuptools documentation, I need

3条回答
  •  借酒劲吻你
    2020-11-27 11:48

    Option 1: Install as package data

    The main advantage of placing data files inside the root of your Python package is that it lets you avoid worrying about where the files will live on a user's system, which may be Windows, Mac, Linux, some mobile platform, or inside an Egg. You can always find the directory data relative to your Python package root, no matter where or how it is installed.

    For example, if I have a project layout like so:

    project/
        foo/
            __init__.py
            data/
                resource1/
                    foo.txt
    

    You can add a function to __init__.py to locate an absolute path to a data file:

    import os
    
    _ROOT = os.path.abspath(os.path.dirname(__file__))
    def get_data(path):
        return os.path.join(_ROOT, 'data', path)
    
    print get_data('resource1/foo.txt')
    

    Outputs:

    /Users/pat/project/foo/data/resource1/foo.txt
    

    After the project is installed as an Egg the path to data will change, but the code doesn't need to change:

    /Users/pat/virtenv/foo/lib/python2.6/site-packages/foo-0.0.0-py2.6.egg/foo/data/resource1/foo.txt
    

    Option 2: Install to fixed location

    The alternative would be to place your data outside the Python package and then either:

    1. Have the location of data passed in via a configuration file, command line arguments or
    2. Embed the location into your Python code.

    This is far less desirable if you plan to distribute your project. If you really want to do this, you can install your data wherever you like on the target system by specifying the destination for each group of files by passing in a list of tuples:

    from setuptools import setup
    setup(
        ...
        data_files=[
            ('/var/data1', ['data/foo.txt']),
            ('/var/data2', ['data/bar.txt'])
            ]
        )
    

    Updated: Example of a shell function to recursively grep Python files:

    atlas% function grep_py { find . -name '*.py' -exec grep -Hn $* {} \; }
    atlas% grep_py ": \["
    ./setup.py:9:    package_data={'foo': ['data/resource1/foo.txt']}
    

提交回复
热议问题