我有一个克隆到myproject
的Git存储库,在存储库的根目录下有一个__init__.py
,使整个东西成为可导入的Python包。
我正在尝试为包写一个setuptools setup.py
,它也位于__init__.py
文件旁边的存储库的根目录中。我希望setup.py
安装它所在的目录作为包。如果setup.py本身作为安装的一部分出现,那就没问题了,但如果没有安装它会更好。
是否支持此配置?我可以通过向package_dir= {"": ".."},
添加setup()
参数来使其工作,告诉它在当前目录上方的目录中查找myproject
。但是,这要求始终从名为myproject
的目录安装程序包,如果通过pip
安装它,或者如果某人是在名为myproject-dev
的Git克隆中,或在许多其他情况下工作。
我正在考虑的另一个黑客是存储库中名为.
的{{1}}的符号链接。这应该有效,但我想先检查是否有更好的方法。
答案 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
; 然后:
/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
。