pythonで簡単なCUIのツールを作っていたとき、pipでインストール時にbash/zshの補完ファイルも一緒にインストールさせたいというのがあったので、やり方について調べてみた。 で、結論としては以下のようなsetup.pyを作成すれば良さそうだということがわかった。
setup.py
python
import os
import platform
import setuptools
# 補完ファイルインストール用関数
def get_data_files():
# 補完ファイルのインストール先を取得する関数
def get_completefile_install_location(shell):
# pathのprefixを定義
prefix = ''
# osの種類を取得
uname = platform.uname()[0]
# 実行ユーザがrootかどうかでprefixを変更
if os.geteuid() == 0:
''' システムインストール時の挙動 '''
if uname == 'Linux' and shell == 'bash':
prefix = '/'
elif uname == 'Linux' and shell == 'zsh':
prefix = '/usr/local'
elif uname == 'Darwin' and shell == 'bash':
prefix = '/'
elif uname == 'Darwin' and shell == 'zsh':
prefix = '/usr'
# shellの種類に応じてインストール先のlocationを変更
if shell == 'bash':
location = os.path.join(prefix, 'etc/bash_completion.d')
elif shell == 'zsh':
location = os.path.join(prefix, 'share/zsh/site-functions')
else:
raise ValueError('unsupported shell: {0}'.format(shell))
# locationを返す
return location
# locationをdict形式で取得する
loc = {
'bash': get_completefile_install_location('bash'),
'zsh': get_completefile_install_location('zsh')
}
# 対象となるファイルをdict形式で指定
files = dict(
bash=['completion/hogehoge-completion.bash'],
zsh=[
'completion/hogehoge-completion.bash',
'completion/_hogehoge'
]
)
# data_files形式でreturn
data_files = []
data_files.append((loc['bash'], files['bash']))
data_files.append((loc['zsh'], files['zsh']))
return data_files
if __name__ == "__main__":
setuptools.setup(
name='hogehoge',
version='0.1.2',
install_requires=[
'hoge',
'fuga'
],
packages=setuptools.find_packages(),
py_modules=['hoge'],
entry_points={
'console_scripts': [
'hoge = hoge:main',
],
},
data_files=get_data_files(),
)
これで、関数内で指定した補完ファイルがインストールされる。