【发布时间】: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