我使用setuptools已经有一段时间了,最近还使用了pip来为我的项目创建发行版,所有这些都很好:像"python“、"python”、“python”之类的命令都是配置好的。现在我想使用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
所以-install.pth应该包含c:\mypackage\src,而不是c:\mypackage。我可以手动编辑ease-install.pth,将"\src“添加到添加的路径中,然后”导入mypackage“成功,就像它应该做的那样。如果我从c:\mypackage命令"python setup.py develop“运行,也会出现同样的问题,因此这个问题很可能在setuptools级别出现。
setup.py有:
setup(
...
packages = find_packages('src'),
package_dir = {'mypackage': 'src/mypackage'},
...
)
(唯一的其他设置参数是文本项,如author、version等,由于与问题无关而没有列出)。
我不想在ease-install.pth中编辑路径。查看这些文档,看不到任何指示将包源根放在与setup.py分离的文件夹中的问题。我做错什么了?
发布于 2013-11-11 14:20:37
我找到了答案。原来这是在distutils级别(pip依赖setuptools,而setuptools依赖distutils)。第2.1节“分发Python模块”讨论了package_dir参数的使用,指出“如果将所有package_dir源代码保存在lib下,那么”root包“中的模块(即根本不在任何包中)在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文件夹都应该在那里;如果它们在其他地方,则必须通知它们。这是通过在package_dir中有一个键'‘的条目来完成的。由于我的原始package_dir没有这样的特性,distutils假设我的dist的根目录是包含setup.py的文件夹,这就是它为可编辑安装所指向的。发行版安装工作正常,因为我曾经说过,mypackage/init.py是在src/mypackage中的,所以对于“常规”发行版来说,所有的工作都很好。
https://stackoverflow.com/questions/19602582
复制