序言:
Python setuptools用于包分发.我有一个Python包(让我们称之为my_package),它有几个extra_require包.一切工作只是找到(安装和构建包,以及额外的,如果被要求),因为所有extra_require都是python包本身和pip正确解决了一切.一个简单的pip install my_package工作就像一个魅力.
设置:
现在,对于其中一个附加内容(让我们称之为extra1),我需要调用非python库的二进制文件X.
模块X本身(源代码)已添加到my_package代码库中,并包含在发行版中my_package.遗憾的是,要使用,X需要首先在目标机器上编译成二进制文件(C++实现;我假设这样的编译将在my_package安装的构建阶段进行).有一个Makefile在X不同的平台的编译优化库,使所有需要的,是运行make在各自的目录X库的my_package构建过程中运行时.
问题1:如何make使用setuptools/distutils在包的构建过程中运行终端命令(即在我的情况下)?
问题2:如何确保只有extra1在安装过程中指定了相应的终端命令才能执行?
例:
pip install my_package,则不会发生这种额外的库编译X.pip install my_package [extra1],则X需要编译模块,因此将在目标计算机上创建并提供相应的二进制文件.我想让我的python包"可以安装pip".问题是该软件包具有必须在用户的init shell脚本中提供的shell脚本(例如.bashrc).
但是在安装之后,用户并不完全知道脚本的去向(大概是/usr/bin,但我们无法保证).当然,用户可以运行which myscript.sh并手动编辑他的init脚本.
但我想自动完成这一步.我可以创建一个新的distutils命令,但pip install不会调用它.我可以扩展distutils.command.install.install,但安装通过pip中断(虽然通过工作python setup.py install):
setup.py
from distutils.command.install import install
class CustomInstall(install):
def run(self):
install.run(self)
# custom stuff here
do_my_stuff()
setup(..., cmdclass={'install': CustomInstall})
Run Code Online (Sandbox Code Playgroud)
贝壳
$ pip install dist/mypackage.tar.gz
Unpacking ./dist/mypackage.tar.gz
Running setup.py egg_info for package from file:///path/to/mypackage/dist/mypackage.tar.gz
Installing collected packages: mypackage
Running setup.py install for mypackage
usage: -c [global_opts] cmd1 [cmd1_opts] [cmd2 [cmd2_opts] ...]
or: -c --help [cmd1 cmd2 ...]
or: -c --help-commands
or: -c …Run Code Online (Sandbox Code Playgroud)