使用setup.py自定义python软件包目录布局

时间:2019-09-05 18:15:43

标签: python directory-structure setup.py sdist

假设我具有以下目录结构:

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尝试了无穷无尽的变体,除了原始目录结构之外,什么也无法产生。

2 个答案:

答案 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变得不那么重要,您的生成器也不会变得更复杂。