我有一个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.
来导入同级模块。效果很好,但是当我将此代码添加到版本控制中并在其他位置克隆项目时,同级导入也遇到了相同的问题。有没有一种方法可以避免每次有人克隆此存储库时运行此命令通过pip安装我的顶级软件包?我尝试在virtualenv中完成所有操作,并在克隆存储库的位置将其激活,并将.egg-info
目录置于版本控制中,但无济于事。我如何分发此软件包,以便如果克隆此仓库,其他人可以运行代码?
我对python比较陌生,所以如果我遗漏了一些明显的东西,我会提前道歉。如果有更好的建议来分发此代码,我也愿意学习。预先感谢!
编辑:(关注评论) 我的项目结构(简化)类似于(下图),其中a和b中的模块需要相互导入。如上所述,我能够做到这一点,但我的用例将需要我部署此代码并按计划运行脚本(假设a.py)。如果我有一个管道来部署此代码,则它应该能够运行而不必手动运行“ pip install”。当我使用设置工具解决同级导入问题时,我意识到这可能不是正确的方法,并且愿意提出建议。提前致谢!
.
├── project
│ ├── a
│ │ ├── a.py
│ │ └── __init__.py
│ ├── b
│ │ ├── b.py
│ │ └── __init__.py
│ └── __init__.py
答案 0 :(得分:0)
使用pip安装时,它将找到所有软件包并相对于父软件包安装它们,因此您可以通过在项目前添加前缀来导入。因此,无论您想在哪里使用,都必须运行pip。
但是,尽管不建议您尝试避免不通过pip运行,但可以假设/ app / home / packages是当前文件夹,执行以下操作:
import sys
sys.path.append("/app/home/packages")
此命令将搜索所有模块,然后将其添加到您的路径中,这样您就无需运行子模块(同级)导入。但是,当您准备分发软件包时,可能需要删除它以使其成为干净的分发。