将package_dir设置为..?

时间:2013-07-19 22:56:34

标签: python packaging setuptools distribute

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

我正在尝试为包写一个setuptools setup.py,它也位于__init__.py文件旁边的存储库的根目录中。我希望setup.py 安装它所在的目录作为包。如果setup.py本身作为安装的一部分出现,那就没问题了,但如果没有安装它会更好。

是否支持此配置?我可以通过向package_dir= {"": ".."},添加setup()参数来使其工作,告诉它在当前目录上方的目录中查找myproject。但是,这要求始终从名为myproject的目录安装程序包,如果通过pip安装它,或者如果某人是在名为myproject-dev的Git克隆中,或在许多其他情况下工作。

我正在考虑的另一个黑客是存储库中名为.的{​​{1}}的符号链接。这应该有效,但我想先检查是否有更好的方法。

2 个答案:

答案 0 :(得分:3)

另请参阅Create editable package setup.py in the same root folder as __init__.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': '.',
    },
)

更新

使此功能可用于可编辑 develop 安装的一种方法是手动修改easy-install.pth文件。

假设:

  • 该项目位于:/home/user/workspace/empty/project;
  • 使用了虚拟环境.venv
  • 该项目已安装python3 -m pip install -e .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

注意:

  • 然后/home/user/workspace/empty中所有看起来像Python软件包的东西都易于导入,这就是为什么最好将项目放置在其自己的目录中的原因,在本例中为目录empty除了目录project外,什么都没有。
  • 模块project.setup也可导入。

答案 1 :(得分:0)

使用符号链接将无法正常工作(您应该获得递归的嵌套目录),请参阅my answer to this other post以获取丑陋的黑客攻击,但其优势在于使用pip