关于 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() 中指定的命令。通过

更直接地调用这个 setup.py
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失败

使用 pip3 安装 pytorch 的问题:-f 选项需要 1 个参数

关于Python2与python3共存的一点补充

wget安装pip和pip3

非参数分析-符号秩和检验法