python-3.x - 使用 setuptools(setup.py) 在主模块之外添加文件夹和子文件夹

标签 python-3.x pip setuptools setup.py python-packaging

所以这是另一个与 setuptools: adding additional files outside package 看起来相似但不同的问题和 Including non-Python files with setup.py .我的结构与第一个问题非常相似

-module
   -python_file1.py
   -python_file2.py
-folder
   -subfolder1
      -data_file_1.txt
   -subfolder2
      -data_file_2.txt

我想要的:我想安装软件包及其中的文件夹、子文件夹和文件。

我尝试了什么:

  • Approach_1:如果我将文件夹移动到模块中,那么我可以轻松地使用 package_data 选项,如

package_data = {'':['folder/**/*']} 但这将迫使我将结构更改为更困惑的结构。假设我有 10-15 个子文件夹。

  • 方法 2:通过使用 data_files 选项,我可以通过简单地使用 glob.glob('my_repo') 扫描整个存储库来列出所有文件,包括文件夹/子文件夹和文件> 但由于我无法控制(或者我可能不知道)目标目录取决于不同的操作系统,所以我无法将文件移动到正确的目标目录中。

我正在为这两种方法寻找一个优雅的解决方案。示例 setup.py 文件仅供引用:

from setuptools import setup, find_packages

setup(
    name='your_project_name',
    version='0.1',
    description='A description.',
    packages=find_packages(),
    package_data={'': ['folders/**/*'},
    include_package_data=True,
    install_requires=[],
)

最佳答案

我相信类似下面的内容可以帮助您:

.
├── data
│   ├── file.txt
│   └── foo
│       ├── bar
│       │   └── file.txt
│       └── file.txt
├── MANIFEST.in
├── setup.cfg
├── setup.py
└── src
    └── thing
        ├── __init__.py
        └── nothing
            └── __init__.py

MANIFEST.in

# ...
recursive-include data *.txt

setup.py

#!/usr/bin/env python3

import pathlib
import setuptools

def main():
    data_packages = [
        'thing/{}'.format(p).replace('/', '.')
        for p
        in pathlib.Path('data').glob('**')
    ]
    packages = setuptools.find_packages(where='src')
    package_dir = {
        'thing': 'src/thing',
        'thing.data': 'data'
    }

    setuptools.setup(
        # see 'setup.cfg'
        packages=packages + data_packages,
        package_dir=package_dir,
        include_package_data=True,
    )

if __name__ == '__main__':
    main()

*.txt被打包为Python工程的thing.data包下的package data。例如可以这样读取数据:

python3 -c "import pkgutil; print(pkgutil.get_data('thing', 'data/foo/bar/file.txt').decode())"

关于python-3.x - 使用 setuptools(setup.py) 在主模块之外添加文件夹和子文件夹,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59653195/

相关文章:

python - GNS3 错误 : WaitForConnectionWorker thread stopping with an error: Could not connect to 127. 0.0.1 在端口 3090 上:[Errno 111] Conexión rehusada

python - 在 Python 正则表达式中指定匹配新行的不同方法

python - 无法安装 Python 库

python - Python 包上的 SSL 错误

python - pip 可编辑安装在只读文件系统上

python - 从 Python 脚本更改环境变量

python - 在不影响性能的情况下减少代码行

python - PIP 安装 "error: package directory ' X' 不存在”

python - 使用带有安装参数的 setuptools

Python 打包 : subdirectories not installed