【问题标题】:Distributing python package using setup tools使用安装工具分发 python 包
【发布时间】:2018-07-15 23:52:44
【问题描述】:

我有一个 python 项目,它的项目结构带有同级导入(从目录结构中的同一级别导入包)。我能够使用设置工具来完成这项工作。

我的包的顶层有一个 setup.py,其中包含以下内容:

from setuptools import setup, find_packages

setup(name='myproject', version='1.0',
      packages=find_packages(), python_requires='>=3.4')

然后我做了一个pip3 install -e .,它允许我通过在导入语句前加上myproject. 来导入同级模块。这很好用,但是当我将此代码添加到版本控制并将项目克隆到其他地方时,我遇到了与同级导入相同的问题。每次有人克隆这个 repo 时,有没有办法避免运行这个命令来通过 pip 安装我的顶级包?我已经尝试在 virtualenv 中执行所有这些操作,并在克隆 repo 的位置激活它,并将.egg-info 目录置于版本控制中,但无济于事。我如何分发这个包,如果这个 repo 被克隆,其他人可以运行代码?

我对 python 比较陌生,所以如果我遗漏了一些明显的东西,我提前道歉。如果对分发此代码有更好的建议,我也愿意学习。提前致谢!

编辑:(跟进 cmets) 我的项目结构(简化)类似于(如下),其中 a 和 b 中的模块需要相互导入。如上所述,我能够完成此操作,但我的用例将要求我部署此代码并按计划运行脚本(假设为 a.py)。如果我有一个管道部署此代码,它应该能够运行而无需手动运行“pip install”。虽然我使用设置工具来解决同级导入问题,但我意识到这可能不是正确的方法,并且愿意接受建议。提前致谢!

.
├── project
│   ├── a
│   │   ├── a.py
│   │   └── __init__.py
│   ├── b
│   │   ├── b.py
│   │   └── __init__.py
│   └── __init__.py

【问题讨论】:

  • 为什么您希望 人克隆您的源代码库并直接从源代码树中使用您的包而不是安装它?这通常不是一个好主意。当它正确的想法时,您必须以不同的方式设计所有内容,而setuptools 无能为力(除非您希望人们构建--inplace 以在源代码树中随机播放文件,但是这通常没有帮助),因为setuptools 是关于安装东西的。
  • 也许安装工具不是正确的方法,我在尝试解决同级导入问题时偶然发现了它。我正在寻找的是将我的代码(通过一些部署管道)部署到不同的 hadoop 集群节点并在那里运行它。如果我不知道它将在哪里运行,我需要某种能够自动打包代码的方法。我正在尝试在另一个集群上克隆 repo 并按原样运行以验证这是否可行
  • 在我看来就像XY problem。你为什么不分享你的项目结构和导入的minimal reproducible example,以及你得到的导入错误?也许你毕竟不需要用setuptools 打包代码。
  • @hoefling 你是对的,我很抱歉。我已经用我的用例和我的项目结构的一个最小示例更新了这个问题。
  • 我会从project 目录中删除__init__.py(假设它是Git 中的根目录),然后在目标机器上克隆repo 后,将project 目录添加到路径: export PYTHONPATH=/path/to/project.

标签: python python-3.x setuptools python-packaging


【解决方案1】:

当您使用 pip 安装时,它会查找所有包并相对于父包安装它们,以便您可以通过在项目前添加前缀来导入。所以无论你想在哪里使用,你都必须运行 pip。

但是,如果您想避免在不通过 pip 的情况下运行,虽然可能不推荐,但您可以执行以下操作,假设 /app/home/packages 是您的当前文件夹:

    import sys
    sys.path.append("/app/home/packages")

此命令将搜索所有模块,然后添加到您的路径中,这样您就不需要遇到子模块(兄弟)导入。但是,当您准备分发包时,您可能希望将其删除以使其成为一个干净的分发。

【讨论】:

    猜你喜欢
    • 2018-02-03
    • 2012-02-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-06-11
    • 2017-10-26
    • 2022-11-05
    • 1970-01-01
    相关资源
    最近更新 更多