Oli*_*ver 6 python install pip
我已经使用了一段时间的setuptools,最近使用pip为我的项目创建了发行版,并且一切正常:诸如“ python setup.py sdist”,“ python setup.py install”之类的命令按配置工作。现在,我想使用pip以“可编辑”的方式安装,以简化我对该程序包进行维护时的测试。所以我尝试了
cd \
pip install -e .\mypackage
Run Code Online (Sandbox Code Playgroud)
这会将路径:c:\ mypackage添加到C:\ python27 \ Lib \ site-packages \ easy-install.pth。但是,在我的情况下,这是错误的,因为mypackage的结构如下:
C:\mypackage
setup.py
src
mypackage
__init__.py
...
docs
tests
Run Code Online (Sandbox Code Playgroud)
因此easy-install.pth应该包含c:\ mypackage \ src,而不是c:\ mypackage。我可以手动编辑easy-install.pth以将“ \ src”添加到添加的路径,然后“ import mypackage”成功完成,应该如此。如果我从c:\ mypackage运行命令“ python setup.py development”,则会发生相同的问题,因此该问题很可能在setuptools级别上。
setup.py具有:
setup(
...
packages = find_packages('src'),
package_dir = {'mypackage': 'src/mypackage'},
...
)
Run Code Online (Sandbox Code Playgroud)
(唯一的其他设置参数是文本项,例如作者,版本等,由于与问题无关,因此未列出)。
我不想在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'},
...
)
Run Code Online (Sandbox Code Playgroud)
正如你从OP中看到的,这对我来说确实是这样,所以我改成了以下内容:
setup(
...
packages = ['mypackage'],
package_dir = {'': 'src'},
...
)
Run Code Online (Sandbox Code Playgroud)
这有效。所以问题是为什么
package_dir = {'': 'src'}
Run Code Online (Sandbox Code Playgroud)
适用于发布和可编辑安装,而
package_dir = {'mypackage': 'src/mypackage'}
Run Code Online (Sandbox Code Playgroud)
适用于发行版,但不适用于可编辑安装。
答案是默认情况下,distutils(以及因此 setuptools 和 pip)期望发行版的“根”是具有 setup.py 的文件夹:要安装在 site-packages 中的任何 *.py 和包文件夹都应该是那里; 如果他们在别处,则必须告知。这是通过在 package_dir 中有一个带键 '' 的条目来完成的。由于我原来的 package_dir 没有这个,distutils 假设我的 dist 的根目录是包含 setup.py 的文件夹,这就是它指向可编辑安装的文件夹。发布安装工作正常,因为 package_dir 正如我所说的那样,mypackage/ init .py 在 src/mypackage 中,它是,所以对于“常规”分发,一切正常。