使用pip进行安装:以递归方式将目录中的文件作为包数据添加

时间:2018-01-31 03:28:26

标签: python flask pip setuptools

我尝试编写setup.py来安装带有pip的Flask应用程序。我有大量的非Python文件要作为包数据安装,例如静态资产。我需要递归地包含这些文件,因为有很多嵌套的子目录,例如:在以下示例的bootstrap/中:

myproject
├── MANIFEST.in
├── setup.py
└── myproject/
    └── app/
        ├── __init__.py
        ├── static/
        |   ├── bootstrap/ (*)
        |   |   └── ...
        |   ├── some.json
        |   └── other.json
        └── templates/
            └── index.html

似乎主要有两种方法可以做到这一点,但是我无法使用这两种方法。

方法1:使用MANIFEST.ininclude_package_data=True

# setup.py
setup_info = dict(
    ...
    include_package_data=True,
    #package_data={},
    ...
)

以及MANIFEST.in中的以下内容:

recursive-include myproject *.json *.html

后跟我的项目根目录中的pip install .。此方法根本不安装任何包数据文件。事实上,当我尝试MANIFEST.ingraft等时,它似乎忽略了我的exclude,而且它们似乎没有效果。

方法2:将package_data与自定义递归查找函数

一起使用
# setup.py
EXTENSIONS = ['*.js', '*.html']

def recursive_get_package_data():
    matches = []
    THIS_FILE_DIR = os.path.dirname(os.path.realpath(__file__))
    for ext in EXTENSIONS:
        for root, dirnames, filenames in os.walk(THIS_FILE_DIR):
            for filename in fnmatch.filter(filenames, ext):
                matches.append(os.path.join(os.path.relpath(root, THIS_FILE_DIR), 
                                            filename))

    return matches


setup_info = dict(
    ...
    #include_package_data=False,
    package_data = {'': recursive_get_package_data()},
    ...
}
setup(**setup_info)

然后是我的项目根目录中的pip install .

此方法根本不安装任何包数据文件。但是,如果不是使用recursive_get_package_data()中的显式相对路径,而是使用扩展globs的列表,即

setup_info = dict(
    ...
    #include_package_data=False,
    package_data = {'': EXTENSIONS},
    ...
)

它只能安装我.js的{​​{1}}和.html个文件。

我错过了什么?我是否需要同时使用__init__.pyinclude_package_data

更新:我设法通过删除顶级目录来获得第二种方法:

package_data

并将其作为关键字传递给:

    THIS_FILE_DIR = os.path.dirname(os.path.realpath(__file__))
    THIS_FILE_DIR = os.path.join(THIS_FILE_DIR, 'myproject')

然而, package_data = {'myproject': recursive_get_package_data()}, 仍然没有运气。

0 个答案:

没有答案