【问题标题】:Difference between pip3 and `python3 setup.py install` regarding cmdclass argument关于 cmdclass 参数的 pip3 和 `python3 setup.py install` 之间的区别
【发布时间】: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 参数。因此,我非常感谢你们的来信。

【问题讨论】:

    标签: python installation pip package setuptools


    【解决方案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...
      

      【讨论】:

        猜你喜欢
        • 2013-12-18
        • 2013-03-21
        • 1970-01-01
        • 2017-05-09
        • 1970-01-01
        • 2017-05-07
        • 1970-01-01
        相关资源
        最近更新 更多