Python pip安装--可编辑:指向错误路径的链接

Python pip安装--可编辑:指向错误路径的链接,python,installation,pip,Python,Installation,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-insta

我已经使用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 develope”,同样的问题也会发生,因此问题可能出现在setuptools级别

setup.py具有以下功能:

setup( 
     ... 
     packages = find_packages('src'), 
     package_dir = {'mypackage': 'src/mypackage'}, 
     ... 
)
(唯一的其他设置参数是文本项,如作者、版本等,未列出,因为与问题无关)


我不想在easy-install.pth中编辑路径。查看文档时,没有发现任何迹象表明将包源根目录放在与setup.py分开的文件夹中是一个问题。我做错了什么

我找到了答案。事实证明,这是在distutils级别(pip依赖于setuptools,而setuptools依赖于distutils)。讨论了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中有一个键为“”的条目来完成的。由于我的原始包_dir没有这个,distutils假定我的dist的根目录是包含setup.py的文件夹,这就是它指向可编辑安装的文件夹。发行版的安装工作正常,因为我看到的包_dir说mypackage/init.py在src/mypackage中,就是这样,所以对于“常规”发行版来说都工作正常

你有没有找到一个同时适用于这两种情况的配置?@SamuelHarmer在
适用于发行版和可编辑安装之前看到了代码是的。为第一次没有正确阅读而道歉。非常感谢。