我已经使用了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”添加到添加的路径中,然后“import 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分开的文件夹中的问题。我做错了什么?
答案 0 :(得分:3)
我找到了答案。事实证明这是在distutils级别(pip依赖于依赖于distutils的setuptools)。 section 2.1 of "Distributing Python Modules"讨论了package_dir参数的使用,指出“[if]你将所有Python源保存在lib下,以便”root package“中的模块(即根本不在任何包中)都在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:any * .py和package文件夹的文件夹,这些文件夹将安装在站点中 - 包裹应该在那里;如果他们在其他地方,必须告诉他们。这是通过在package_dir中使用带键''的条目来完成的。由于我原来的package_dir没有这个,distutils认为我的dist的根是包含setup.py的文件夹,这就是它为可编辑安装指向的内容。发布安装工作正常,因为我所说的package_dir说mypackage / init .py在src / mypackage中,它就是这样,所以对于“常规”分发一切正常。