【问题标题】:configure setup.py in order to provide multiple installation mode配置 setup.py 以提供多种安装模式
【发布时间】:2019-05-18 02:07:30
【问题描述】:

是否有任何解决方案可以使用 setup.py 创建特定安装的 python 包?

我想根据将提供给 pip 的一些参数安装不同的模块。

编辑

也许,我的第一条消息不清楚,我会尝试以下更好的解释。

我们有一个共享的 python 包,以便与整个公司的技术人员共享一些代码。该软件包位于私有仓库中,可通过 pip 安装。

遗憾的是,这个包变得越来越大,我们现在在尝试安装它时会遇到一些性能问题。

我想知道是否有可能以某种方式创建一个自定义 setup.py 脚本,该脚本将允许用户仅安装模块的一小部分而不是整个模块。

感谢您的帮助

【问题讨论】:

  • 也许你真正想要的是virtualenv.pypa.io/en/latest ??
  • 应该做的是将东西从那个包迁移到专门的包中。但是,您设法使软件包在安装时导致性能问题有多大?

标签: python pip setup.py


【解决方案1】:

setup.py 中应该有这样一行:

setup(
    # ...
    packages=find_packages(),
    # ...
)

要解决您的问题,您需要使用此find_packages 方法,此函数返回此项目中的python 包列表

所以解决方案很简单,为 setup.py 获取用户参数,并基于此返回 find_packages 的选择

这是一个简化的代码

if '--full' in sys.argv:
    packages = find_packages()
elif '--only-module-a':
    packages = [p for p in find_packages() if p.startswith('a')]

setup(
    # ...
    packages=packages,
    # ...
)

PS:正如@hoefling 评论的那样,这个解决方案是一个hacky,并且可能会引起用户的误解,你应该将包分成更小的子包(你仍然可以将它们保存在一个仓库中)

【讨论】:

  • 谢谢!只是不明白如何安装模块。 pip install modulename --full 不起作用,因为 --full 不是点子选项。
  • 使用python setup.py install --full
  • 无意冒犯,但这是一个糟糕的解决方案。分发包是原子的,不能进一步划分。现在我将能够安装具有相同元数据但代码库不同的包。如果我想声明对这个包的依赖,则无法指定我需要它的“版本”。唯一真正的解决方案是@MartijnPieters 在他的评论中所写的 - 将大包分成小包,如有必要,可能会在命名空间包下收集包套件的代码库。
  • @hoefling 是的,你是对的。也许创建多个 setup.py 是更好的主意(而不是解析 args)。但我同意你的最终解决方案是分离包本身
【解决方案2】:

您是否尝试过使用pip freeze > requirements.txt 生成您已安装的所有软件包的文本文件,在该文本文件中编辑您想要的软件包和版本,然后pip install -r requirements.txt 将其安装到其他地方?

【讨论】:

    猜你喜欢
    • 2014-11-07
    • 2012-04-14
    • 1970-01-01
    • 1970-01-01
    • 2017-08-03
    • 2011-11-29
    • 1970-01-01
    • 2016-02-27
    • 1970-01-01
    相关资源
    最近更新 更多