使用安装工具分发python软件包

时间:2018-07-15 23:52:44

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

我有一个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

1 个答案:

答案 0 :(得分:0)

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

但是,尽管不建议您尝试避免不通过pip运行,但可以假设/ app / home / packages是当前文件夹,执行以下操作:

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

此命令将搜索所有模块,然后将其添加到您的路径中,这样您就无需运行子模块(同级)导入。但是,当您准备分发软件包时,可能需要删除它以使其成为干净的分发。