首页 > 解决方案 > 如何将 shell 脚本打包到 pip 包中

问题描述

我有一个用于所有模块的通用 shell 脚本。

所有模块都安装了一个名为common. 脚本是这样的

common
   utils
     scripts
       build
         generic_build.sh

我已经看到有一种方法可以通过添加到setup.py使用scriptsconsole_scripts参数来安装 python 脚本。但sh文件似乎被忽略了。这意味着它们最终不会出现在已安装的软件包中。

有任何想法吗?

标签: pythonpip

解决方案


Shell 脚本可以通过将它们添加到scripts列表中来捆绑在一个发行版中,就像它们是 python 脚本一样。例子:

# bash_scripts/spam.sh
#!/usr/bin/env bash
echo Running "$0"

用于打包的简单设置脚本spam.sh

# setup.py
from setuptools import setup

setup(
    name='spam',
    scripts=['bash_scripts/spam.sh']
)

构建源和二进制文件包括spam.sh

$ python setup.py bdist_wheel | grep spam.sh
copying bash_scripts/spam.sh -> build/scripts-3.6
copying build/scripts-3.6/spam.sh -> build/bdist.linux-aarch64/wheel/spam-0.0.0.data/scripts
changing mode of build/bdist.linux-aarch64/wheel/spam-0.0.0.data/scripts/spam.sh to 755
adding 'spam-0.0.0.data/scripts/spam.sh'

$ python setup.py sdist | grep spam.sh
copying bash_scripts/spam.sh -> spam-0.0.0/bash_scripts

安装后,检查shell脚本是否包含:

$ pip install dist/spam-0.0.0.tar.gz
...
$ pip show -f spam
Name: spam
Version: 0.0.0
Summary: UNKNOWN
Home-page: UNKNOWN
Author: UNKNOWN
Author-email: UNKNOWN
License: UNKNOWN
Location: /data/gentoo64/home/u0_a82/.local/lib64/python3.6/site-packages
Requires:
Files:
  ../../../bin/spam.sh
  spam-0.0.0.dist-info/DESCRIPTION.rst
  spam-0.0.0.dist-info/INSTALLER
  spam-0.0.0.dist-info/METADATA
  spam-0.0.0.dist-info/RECORD
  spam-0.0.0.dist-info/WHEEL
  spam-0.0.0.dist-info/metadata.json
  spam-0.0.0.dist-info/top_level.txt

推荐阅读