我已经使用setuptools一段时间了,最近又使用pip为我的项目创建发行版,并且一切正常:"python setup.py sdist","python setup.py install"等命令按配置工作。现在我想使用 pip 作为"可编辑"安装,以便在我对此包进行维护时简化测试。所以我尝试了
cd
pip install -e .mypackage
这会将路径:c:\mypackage添加到C:\python27\Lib\site-packages\easy-install.pth。但是,就我而言,这是错误的,因为mypackage的结构如下:
C:mypackage
setup.py
src
mypackage
__init__.py
...
docs
tests
所以easy-install.pth应该包含c:\mypackage\src,而不是c:\mypackage。我可以手动编辑easy-install.pth以将"\src"添加到添加的路径中,然后"导入mypackage"成功,这是应该的。如果我从 c:\mypackage 运行命令"python setup.py develop",也会出现同样的问题,因此问题可能出在 setuptools 级别。
setup.py 有:
setup(
...
packages = find_packages('src'),
package_dir = {'mypackage': 'src/mypackage'},
...
)
(唯一的其他设置参数是文本项目,如作者、版本等,由于与问题无关,因此未列出)。
我不想在easy-install.pth中编辑路径。查看文档,看不到任何表明将包源根放在与 setup.py 分开的文件夹中是一个问题。我做错了什么?
我找到了答案。事实证明,这是在distutils级别(pip依赖于依赖于distutils的setuptools)。"分发 Python 模块"的第 2.1 节讨论了package_dir参数的使用,指出"[如果]您将所有 Python 源代码保存在 lib 下,以便"根包"中的模块(即根本不在任何包中)在 lib 中,foo 包中的模块在 lib/foo 中,",那么您应该使用
setup(
...
packages = ['foo'],
package_dir = {'': 'lib'},
...
)
从OP中可以看出,我确实是这种情况,所以我改为以下内容:
setup(
...
packages = ['mypackage'],
package_dir = {'': 'src'},
...
)
这奏效了。所以问题是为什么
package_dir = {'': 'src'}
适用于版本和可编辑安装,而
package_dir = {'mypackage': 'src/mypackage'}
适用于版本,但不适用于可编辑安装。
答案是,默认情况下,distutils(以及setuptools和pip)期望发行版的"根"是具有 setup.py 的文件夹:要安装在站点包中的任何*.py和包文件夹都应该在那里;如果他们在其他地方,则必须被告知。这是通过在package_dir中有一个带有键"的条目来完成的。由于我的原始package_dir没有这个,distutils 假设我的 dist 的根目录是包含 setup.py 的文件夹,这就是它指向可编辑安装的内容。发布安装工作正常,因为package_dir就像我说的那样,mypackage/init.py 在 src/mypackage 中,它是,所以对于"常规"分发来说一切都工作正常。