pip install --可编辑:链接到错误的路径



我已经使用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 中,它是,所以对于"常规"分发来说一切都工作正常。

相关内容

最新更新