使用pip安装:递归地将目录中的文件作为包d添加

2024-04-25 14:29:59 发布

您现在位置:Python中文网/ 问答频道 /正文

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

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

似乎主要有两种方法可以做到这一点,但我不能得到任何一种方法工作。在

方法一:使用MANIFEST.in和{}

^{pr2}$

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

recursive-include myproject *.json *.html

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

方法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.html文件,其中我有__init__.py。在

我错过了什么?我需要同时使用include_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()},

然而,仍然没有幸运的MANIFEST.in。在


Tags: path方法inpypackagedataosmyproject