使用pip执行安装后任务

时间:2019-06-07 13:14:20

标签: python-3.x pip setuptools pypi python-wheel

我的项目树结构

.
├── 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, },
      ...      
)

运行PostInstallpython3 setup.py install执行正常。因此,如下所示从this doc上传到Pypi

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

但是当我运行pip install funmotd时,PostInstall没有执行的,我看到dist/*就像是静态编译的东西。 当我运行pip install funmotd时,是否有任何技巧可以运行安装后任务。或如何使setup.pypip执行。

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

PS::我不希望用户克隆存储库并运行python setup.py install。想要简单pip install funmotd

UDPATE1

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

2 个答案:

答案 0 :(得分:3)

pip不能从轮子上运行setup.py,因此您不能在轮子上从setup.py运行任何安装后代码。

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

答案 1 :(得分:-1)

首先,您需要调用父运行,然后才能执行其余的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

这有望解决问题-我遇到了与自己非常相似的问题,这些问题在本地运行,但不是通过点子进行。