11

我有一个 Git 存储库克隆到myproject中,__init__.py在存储库的根目录下,使整个东西成为一个可导入的 Python 包。

我正在尝试为包编写一个 setuptools ,它也将位于存储库的根目录中,位于文件setup.py旁边。__init__.py我想setup.py它所在的目录安装为一个包。如果 setup.py 本身作为安装的一部分出现很好,但如果没有它会更好。理想情况下,这也应该在可编辑模式下工作 ( pip install -e .)

是否完全支持此配置?我可以通过一个package_dir= {"": ".."},参数来让它工作setup(),告诉它myproject在当前目录上方的目录中查找。但是,这要求软件包始终从名为 的目录安装myproject,例如,如果它是通过 安装的pip,或者如果有人正在使用名为 的 Git 克隆myproject-dev,或者在任何其他案例。

我正在考虑的另一个技巧是在存储库中.命名的符号链接mypackage。这应该可行,但我想先检查是否有更好的方法。

4

2 回答 2

6

另请参阅在与 __init__.py 相同的根文件夹中创建可编辑的包 setup.py

据我所知,这应该有效:

myproject-dev/
├── __init__.py
├── setup.py
└── submodule
    └── __init__.py
#!/usr/bin/env python3
import setuptools
setuptools.setup(
    name='MyProject',
    version='0.0.0.dev0',
    packages=['myproject', 'myproject.submodule'],
    package_dir={
        'myproject': '.',
    },
)

更新

使这项工作适用于可编辑开发安装的一种方法是手动修改easy-install.pth文件。

假设:

  • 该项目位于:/home/user/workspace/empty/project;
  • 使用虚拟环境.venv
  • 该项目使用python3 -m pip install -e .or安装python3 setup.py develop
  • Python版本是3.6。

然后:

  • 该文件位于以下位置/home/user/workspace/empty/project/.venv/lib/python3.6/site-packages/easy-install.pth
  • 它的内容是:/home/user/workspace/empty/project.

为了让导入按预期工作,可以编辑这一行以阅读以下内容:

  • /home/user/workspace/empty

笔记:

  • 看起来像 Python 包的所有/home/user/workspace/empty内容都容易被导入,这就是为什么将项目放在它自己的目录中是个好主意,在这种情况下,该目录empty只包含 directory project
  • 该模块project.setup也是可导入的。
于 2019-10-17T09:26:21.587 回答
0

使用符号链接效果不佳(您应该获得递归嵌套目录),请参阅我对其他帖子的回答以获得丑陋的黑客攻击,但它具有使用pip.

于 2017-08-16T07:31:37.503 回答