使用 pip 执行 post 安装任务

Execute post installation task with pip

我的项目树结构

.
├── example.gif
├── funmotd
│   ├── config.json
│   ├── __init__.py
│   └── quotes_db.py
├── LICENSE
├── README.md
└── setup.py

setup.py(删除了一些代码以减少代码)

import sys
import os
import setuptools
from setuptools.command.install import install

class PostInstall(install):
    def run(self):
        mode = 0o666
        bashrc_file = os.path.join(os.path.expanduser('~'), ".bashrc")
        install.run(self)
        # Added CLI to .bashrc
        # Change "config.json" file permission


setuptools.setup(
      ...
      entry_points={'console_scripts': ['funmotd = funmotd:main']},
      package_dir={'funmotd': 'funmotd/'},
      package_data={'funmotd': ['config.json'], },
      include_package_data=True,
      python_requires=">=3.4",
      cmdclass={'install': PostInstall, },
      ...      
)

PostInstall 在 运行 python3 setup.py install 时执行良好。所以,像下面这样上传到 Pypi(来自 this doc

$ python3 setup.py bdist_wheel
# Created "dist", "funmotd.egg-info" and "build" dirs
$ twine upload dist/*

但是当我 运行 pip install funmotd, PostInstallNOT 执行时,我看到 dist/* 就像静态编译东西。 我运行pip install funmotd的时候运行post安装任务有什么技巧吗?或者如何让 setup.pypip 处执行。

我遵循了以下问题,但没有得到我需要的解决方案

PS: 我不希望用户克隆 repo 和 运行 python setup.py install。想简单点pip install funmotd

UDPATE1

似乎已经有 issue on github 是长线程

您需要调用父 运行,首先,在执行其余 PostInstall 之前,您可以尝试:

class PostInstall(install):
def run(self):
    install.run(self)
    mode = 0o666
    bashrc_file = os.path.join(os.path.expanduser('~'), ".bashrc")
    # Added CLI to .bashrc
    # Change "config.json" file permission

这有望解决问题 - 我自己也遇到过非常相似的问题,在本地工作,但不是通过 pip。

pip 不会 运行 setup.py 来自轮子因此你不能 运行 来自轮子 setup.py 的任何 post-installation 代码.

setup.py 用于构建轮子或在安装源分发 (sdist) 期间使用。因此,如果您希望 post-installation 脚本停止将轮子上传到 PyPI,请仅发布源代码分发 (python3 setup.py sdist)。然后 pip install funmotd 将 运行 来自 setup.py 的代码。