关于 cmdclass 参数的 pip3 和 `python3 setup.py install` 之间的区别
Posted
技术标签:
【中文标题】关于 cmdclass 参数的 pip3 和 `python3 setup.py install` 之间的区别【英文标题】:Difference between pip3 and `python3 setup.py install` regarding cmdclass argument 【发布时间】:2017-10-22 17:10:08 【问题描述】:我尝试配置我的包,以便在安装过程中执行脚本。因此,我继承了 setuptools.command install 并创建了我的自定义类ActionOnInstall
来在安装包时做一些事情。此类通过 setuptools setup()
参数 cmdclass
调用,如 here 所述。
这种 setup.py 文件的最小示例如下所示
from setuptools import find_packages, setup
from setuptools.command.install import install
class ActionOnInstall(install):
def run(self):
print("Call install.run(self) works!")
install.run(self)
setup(name='name',
cmdclass=
'install': ActionOnInstall)
通过执行构建包
pip3 install <path-to-dir-with-setup.py>
成功运行但不执行ActionOnInstall.run()
中指定的命令。通过
python3 setup.py install
执行ActionOnInstall.run()
中指定的命令。
然后,我发现自己在问:这两种安装软件包的方法的实际区别是什么。我知道,就像其他帖子告诉我们的那样,pip 让安装包的工作变得更轻松。但是没有解释这两种方法如何区别对待setup()
的cmdclass
参数。因此,我非常感谢你们的来信。
【问题讨论】:
【参考方案1】:pip 会调用你的 setup.py,但它会重定向 stdout/stderr。在 pip 下测试 setup.py 写入固定位置的文件:
class ActionOnInstall(install):
def run(self):
print("Call install.run(self) works!", file=open('/tmp/debug.log', 'w'))
install.run(self)
在pip install .
之后查看/tmp/debug.log
【讨论】:
【参考方案2】:pip 在安装你的包时运行python setup.py install
- 它不会改变你的 setup.py 感觉执行的方式。
您看不到任何输出的原因是,正如@phd 所提到的,pip 默认情况下会隐藏运行setup.py
文件的所有输出,因为运行python setup.py install
时打印的大部分信息对大多数人来说都没有用用户。
通过将“--verbose”选项传递给pip install
,您可以看到这个隐藏的输出,以及 pip 所做的一切:
$ pip install --verbose ./foo
Processing ./foo
Running setup.py (path:/private/var/folders/4d/bt0_xfx56bjfmmt2bv3r5_qh0000gn/T/pip-ti0o0gtu-build/setup.py) egg_info for package from file:///Users/pradyunsg/.venvwrap/venvs/t
mp-c0ebb35987c76ad/foo
Running command python setup.py egg_info
running egg_info
creating pip-egg-info/foo.egg-info
writing pip-egg-info/foo.egg-info/PKG-INFO
writing dependency_links to pip-egg-info/foo.egg-info/dependency_links.txt
writing top-level names to pip-egg-info/foo.egg-info/top_level.txt
writing manifest file 'pip-egg-info/foo.egg-info/SOURCES.txt'
reading manifest file 'pip-egg-info/foo.egg-info/SOURCES.txt'
writing manifest file 'pip-egg-info/foo.egg-info/SOURCES.txt'
Source in /private/var/folders/4d/bt0_xfx56bjfmmt2bv3r5_qh0000gn/T/pip-ti0o0gtu-build has version 0.0.0, which satisfies requirement foo==0.0.0 from file:///Users/pradyunsg/.ve
nvwrap/venvs/tmp-c0ebb35987c76ad/foo
Could not parse version from link: file:///Users/pradyunsg/.venvwrap/venvs/tmp-c0ebb35987c76ad/foo
Installing collected packages: foo
Running setup.py install for foo ... Running command /Users/pradyunsg/.venvwrap/venvs/tmp-c0ebb35987c76ad/bin/python3.6 -u -c "import setuptools, tokenize;__file__='/privat
e/var/folders/4d/bt0_xfx56bjfmmt2bv3r5_qh0000gn/T/pip-ti0o0gtu-build/setup.py';f=getattr(tokenize, 'open', open)(__file__);code=f.read().replace('\r\n', '\n');f.close();exec(comp
ile(code, __file__, 'exec'))" install --record /var/folders/4d/bt0_xfx56bjfmmt2bv3r5_qh0000gn/T/pip-cetn8xa9-record/install-record.txt --single-version-externally-managed --compi
le --install-headers /Users/pradyunsg/.venvwrap/venvs/tmp-c0ebb35987c76ad/bin/../include/site/python3.6/foo
running install
Call install.run(self) works!
running build
running install_egg_info
running egg_info
creating foo.egg-info
writing foo.egg-info/PKG-INFO
writing dependency_links to foo.egg-info/dependency_links.txt
writing top-level names to foo.egg-info/top_level.txt
writing manifest file 'foo.egg-info/SOURCES.txt'
reading manifest file 'foo.egg-info/SOURCES.txt'
writing manifest file 'foo.egg-info/SOURCES.txt'
Copying foo.egg-info to /Users/pradyunsg/.venvwrap/venvs/tmp-c0ebb35987c76ad/lib/python3.6/site-packages/foo-0.0.0-py3.6.egg-info
running install_scripts
writing list of installed files to '/var/folders/4d/bt0_xfx56bjfmmt2bv3r5_qh0000gn/T/pip-cetn8xa9-record/install-record.txt'
done
Removing source in /private/var/folders/4d/bt0_xfx56bjfmmt2bv3r5_qh0000gn/T/pip-ti0o0gtu-build
Successfully installed foo-0.0.0
Cleaning up...
【讨论】:
以上是关于关于 cmdclass 参数的 pip3 和 `python3 setup.py install` 之间的区别的主要内容,如果未能解决你的问题,请参考以下文章
关于cmd安装pip3模块失败的 Read timed out.的补救方法
关于pip3 install face_recognition失败