gpt4 book ai didi

python - 在 setup.py 中使用来自依赖项的代码

转载 作者:行者123 更新时间:2023-11-28 19:24:18 25 4
gpt4 key购买 nike

我有一个小的 web 框架,我们称它为 Bread,它用于构建 Jam、Marmalade、PeanutButter 等应用程序浇头。面包既构建服务这些应用程序。

我正在尝试找出如何制作应用程序的 setup.py工作,给定以下要求:

  • 应用依赖于 Bread,通过 setuptool's install_requires
  • 要在开发时构建应用程序,Bread 会读取一些配置然后将 Assets (HTML、JS、CSS、图像等)发送到应用程序的 output 目录。换句话说,bread devserver读取 Jam/bread.yaml 并在 Jam/output 中组装 Assets ,然后为应用程序提供服务(通过 Flask,但这与其他方面无关)​​。
  • 为了构建一个可部署 Jam 应用程序,我想调用在 Jam 的 python setup.py install 期间构建面包卡纸/输出。在生产环境中,Jam 不需要构建任何东西。
  • 我定义了一个自定义的 bdist_egg 安装命令,其中initialize_options 导入 Bread,调用构建器,然后设置self.distribution.data_files 与适当的元组,之前调用基类。 (而且 一点也不有趣。)
  • 现在,bdist_egg 是在 Jam 的 setup.py 中定义的。我想要将此代码和其他样板代码移动到 bread.setup 中,以便我可以在果酱、花生酱等中重复使用。
  • 可能,这意味着我现在正在导入之前的 Bread 代码面包已安装。这肯定会出现在全新安装中,例如构建机器上的全新 virtualenv。

这可以用 Distutils/setuptools/Distribute 来完成吗?

最佳答案

我也在Distutils-SIG问过这个问题.在那里提到 setup_requires 让我想到 https://stackoverflow.com/a/12061891/6364 , 这给了我提示我需要:在调用 setup 之前创建一个单独的 Distribution 对象它定义了 setup_requires 条目。

Jam 的 setup.py 现在看起来像:

from setuptools import setup, dist

dist.Distribution(dict(setup_requires='Bread'))

from bread.setup_topping import *

setup(
name='Jam',
version='0.2',
long_description=open('README.md').read(),
**topping_setup_options
)

# Remove *.egg left by bootstrapping Bread
cleanup_bread_bootstrap()

编辑:需要更好地解释 Jam 的 setup.py 中发生的事情:

  • 最初的 Distribution(setup_requires='Bread') 使用 easy_install当前目录中安装 Bread 及其依赖项。
  • 调用 setup() 触发下面的 bdist_egg,它使用 Bread构建 Jam 的输出。在当前目录中找到面包。
  • setup() 稍后安装 Jam、Bread 和所有依赖项,在正确的位置。
  • cleanup_bread_bootstrap() 的调用移除了所有 Eggs由初始 Distribution 放置在当前目录中。

bread/setup_topping.py 看起来像:

from setuptools.command.bdist_egg import bdist_egg as _bdist_egg
import os, fnmatch, glob, shutil

def recursive_data_files(treeroot, pattern):
results = []
for base, dirs, files in os.walk(treeroot):
goodfiles = fnmatch.filter(files, pattern)
if goodfiles:
results.append((base, [os.path.join(base, f) for f in goodfiles]))
return results

def make_data_files(output='output'):
return (
[('', ['bread.yaml'])]
+ recursive_data_files(output, '*')
)

class bdist_egg(_bdist_egg):
def initialize_options(self):
bake_bread() # build files to './output'
self.distribution.data_files = make_data_files()
_bdist_egg.initialize_options(self)

topping_setup_options = dict(
cmdclass={
'bdist_egg': bdist_egg,
},
install_requires=[
'Bread',
],
zip_safe=False,
)

def cleanup_bread_bootstrap(root='.'):
for f in glob.glob(os.path.join(os.path.abspath(root), '*.egg')):
if os.path.isdir(f):
shutil.rmtree(f) # Egg directory
else:
os.remove(f) # Zipped Egg

关于python - 在 setup.py 中使用来自依赖项的代码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16822400/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com