所以这是另一个与 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/