【问题标题】:Customizing python package directory layout with setup.py使用 setup.py 自定义 python 包目录布局
【发布时间】:2020-01-08 16:22:34
【问题描述】:

假设我有以下目录结构:

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

【问题讨论】:

  • 您是否看到任何错误或它基本上不输出任何内容?您能否强调一下设置的执行会发生什么?
  • 请列出你为package_dir尝试过的所有组合?
  • @TarunLalwani 许多当时的实验在失败后立即被丢弃。记录丢失。如果您有兴趣,用户sinoroc 提供了一个很好的解决方案。

标签: setuptools setup.py distutils python-packaging


【解决方案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/generated 中获取python 包的代码。在 built 发行版中,您将找到正确的目录结构。

【讨论】:

  • setup.py 放在src 目录中对我来说不是一个选项。但我正要以相同的原理得到想要的结果:package_dir: { 'src.python': 'src/python/generated' } 并调整packages!非常感谢!
  • 很高兴它有帮助。请注意,您可以使用package_dir: { 'whatever_package_name_you_like': 'src/python/generated' },并相应地调整packages 参数。
【解决方案2】:

首先,这是我的解决方案:

#!/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 将变得微不足道,您的生成器也不会更复杂。

【讨论】:

  • 谢谢!深入了解生成的布局很有帮助!
猜你喜欢
  • 1970-01-01
  • 2012-05-14
  • 2017-11-30
  • 2013-03-06
  • 2019-01-03
  • 2015-01-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多