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

9

我已经使用setuptools和pip一段时间来为我的项目创建分发包,所有命令都能正常工作,例如“python setup.py sdist”、“python setup.py install”。现在我想使用pip以“editable”的方式进行安装,以便在维护此软件包时更容易进行测试。因此,我尝试了以下操作:

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分离的文件夹中会造成问题的任何迹象。我做错了什么吗?


你如何找到可编辑路径的位置? - Charlie Parker
1个回答

11
我找到了答案。原来这是在distutils层面上(pip依赖于setuptools,而setuptools依赖于distutils)。“分发Python模块”第2.1节讨论了package_dir参数的使用,指出“[如果]您将所有Python源代码放在lib下,以便根包中的模块(即根本没有任何包中的模块)位于lib中,foo包中的模块位于lib / foo中”,那么您应该使用。
setup(
   ...
   packages = ['foo'],
   package_dir = {'': 'lib'},
   ...
)

从原帖可以看出,这对我确实是适用的情况,所以我改成了以下内容:

setup(
   ...
   packages = ['mypackage'],
   package_dir = {'': 'src'},
   ...
)

这个有用。那么问题是为什么

   package_dir = {'': 'src'}

适用于发布和可编辑安装,而

   package_dir = {'mypackage': 'src/mypackage'}

此方法适用于发布版本,但不适用于可编辑安装。

答案是,默认情况下,distutils(因此也包括setuptools和pip)期望分发的“根”是具有setup.py的文件夹:任何要安装在site-packages中的*.py和包文件夹都应该在那里;如果它们在其他地方,就必须告诉它。这可以通过在package_dir中具有键''的条目来完成。由于我的原始package_dir没有这个,distutils假设我的dist的根是包含setup.py的文件夹,并且这就是它为可编辑安装指向的位置。发布安装正常工作,因为我将package_dir设置为mypackage/init.py位于src/mypackage中,而实际上它确实在那里,因此对于“常规”分发,一切正常。


1
你是否曾经找到过适用于两者的配置? - Samuel Harmer
@SamuelHarmer 请查看上面 works for releases and editable install 代码之前的部分。 - Oliver
啊,是的。第一次没有仔细阅读,抱歉。谢谢。 - Samuel Harmer
你如何找到可编辑路径的位置? - Charlie Parker

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接