pip install --editable:指向错误路径的链接

时间:2013-10-26 03:48:32

标签: python install pip

我已经使用了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分开的文件夹中的问题。我做错了什么?

1 个答案:

答案 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中,它就是这样,所以对于“常规”分发一切正常。