假设我具有以下目录结构:
src/
└── python/
└── generated/
├── __init__.py
├── a.py
└── lib/
├── __init__.py
└── b.py
setup.py
的外观是什么,以便创建具有以下目录布局的dist:
src/
└── python/
├── __init__.py
├── a.py
└── lib/
├── __init__.py
└── b.py
目标是简单地消除generated
文件夹。我用package_dir
尝试了无穷无尽的变体,除了原始目录结构之外,什么也无法产生。
答案 0 :(得分:1)
您的setup.py
应该放在您的src
目录中,并且应如下所示:
#!/usr/bin/env python3
import setuptools
setuptools.setup(
name='Thing',
version='1.2.3',
packages=[
'python',
'python.lib',
],
package_dir={
'python': 'python/generated',
},
)
请注意package_dir
设置。它指示setuptools
从目录python
获取python/generated
包的代码。在内置发行版中,您将找到正确的目录结构。
答案 1 :(得分:0)
首先,这是我的解决方案:
#!/usr/bin/env python
import os, shutil
from setuptools import setup
from setuptools.command.build_py import build_py
class BuildPyCommand(build_py):
"""Custom build command."""
def run(self):
shutil.rmtree('src.tmp', ignore_errors=True)
os.mkdir('src.tmp')
shutil.copytree('src/python/generated', 'src.tmp/python')
build_py.run(self)
setup(cmdclass={ 'build_py': BuildPyCommand },
name='Blabla',
version='1.0',
description='best desc ever',
author='Me',
packages=['python', 'python.lib'],
package_dir={'': 'src.tmp'},
setup_requires=['wheel']
)
您可以使用以下方法生成您的发行版:
python setup.py build bdist_wheel
想法是执行两个步骤:
我将其交付给大家,是因为它不需要将来的用户了解我的技巧。如果您尝试使用源代码分发,您会注意到您需要将生成的文件作为数据发布(这并不困难,但麻烦,而且,我想您想对用户隐藏窍门)。
但是,我认为您的过程中存在设计缺陷。假设是模块src/python/generated/__init__.py
的文件<something>.generated
最终成为您的<something>.python
,这很麻烦。生成有效的Python结构src/generated/python/__init__.py
会更简单,更可靠。 setup.py变得不那么重要,您的生成器也不会变得更复杂。