8
7

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

OSSTechAdvent Calendar 2018

Day 16

pythonアプリケーションをrpmにパッケージング

Last updated at Posted at 2018-12-15

はじめに

Pythonで開発したアプリケーションを別の環境に持っていったり、第三者に配布する時、setup.pyの書き方を何度も調べてる自分に向けたそれです。

Pythonのパッケージングツールって色々有りますけど、
とりあえず今回はpipをインストールしたらセットでくっついてくるsetuptoolsを使おうと思います。

公式さんもおすすめしていることですし。

setuptoolsの使い方を説明した記事等はネットにゴロゴロ転がっているので、
今回は以前の記事と絡めて、
rpmパッケージにするところまでやりたいと思います。

setuptoolsに関してより細かい内容が気になる方は以下が非常に参考になりました

パラメータの一覧などを参照したいときはsetuptools公式なども参考になります。
ただし英語なので私みたいな英語苦手エンジニアは苦労するかもしれません()

検証環境

私がこの記事を書く上で検証につかった環境がこちら

$ python3 --version
Python 3.4.9
$ pip list
Package     Version
----------- -------
Click       7.0    
flake8      3.6.0  
Jinja2      2.10   
MarkupSafe  1.1.0  
mccabe      0.6.1  
pip         18.1   
pycodestyle 2.4.0  
pyflakes    2.0.0  
PyYAML      3.13   
setuptools  40.6.3 
wheel       0.32.3
$
$ cat /etc/centos-release
CentOS Linux release 7.6.1810 (Core)

setup.pyとsetup.cfg

setuptoolsはバージョン30.3.0から引数を設定ファイルから受け取る仕組みが追加されました。
それまではパッケージングに含める情報をすべてsetup.pyファイル内setup()関数の初期値として列挙し、以下のようなコードになっていたと思います。

setup.py
from setuptools import setup

setup(
  name = 'packageName',
  version = '1.0.0',
  description = 'python application',
  install_requires = ["package"],
  extras_require = {
    'dev': ['dev-package'],
  },
  entry_points = {
    'console_scripts': [
      'command = package.pakcage:main'
    ]
  }
)

正直見にくい。かと言ってsetuptools自体がこういうものなのでこうするしかなかった...

しかしsetup.cfgを使うとこうなります!!

setup.py
from setuptools import setup

setup()

おーすっきり!肝心の設定はどこ言ったかと言うとseutp.cfgという別ファイルでiniファイルのような形式1で記述します。

[metadata]
name = packageName
version = 1.0.0
license = file: LICENSE

[options]
zip_safe = False
install_requires =
  package

[options.extras_require]
dev = 
  dev-package

[oprions.entry_points]
console_scripts =
  command = package.package:main

こっちのほうがわかりやすくて好みです(個人差あり)。

licenseでやっているようにfile:のようなディレクティブをつけて別ファイルから読み込んだりすることも出来ます。たまにsetup.pyでpythonコードごりごりにこねくり回してるパッケージが有りますが、設定ファイルでコードはかけないので、その値を入れるキーのみsetup.py内で指定するような形になると思います。

指定できる値やディレクティブは公式で一覧になっているのでご参照ください。
Configuring setup() using setup.cfg files

さてsetup.pysetup.cfgが書けたらもう簡単です。
下記のコマンドを実行すると必要なファイルがすべてまとめられたtarボールが作成されます。

$ python setup.py sdist

distというディレクトリが作成され、作成されたtarボールが保存されています。
ちなみにこのtarボールのままpipコマンドでインストールも可能です。

$ pip install package.tar.gz

wheelパッケージを作成

wheelとはPEP 427で標準化されているPythonのパッケージング形式です。
中身はzipファイルなので解凍するといろいろ出てきます。
とりあえずPythonのアプリケーションをパッケージングするならtarよりwheel形式のほうがよいということですね。

wheel形式でパッケージングする方法はsetup.pyが完成していればあっという間です。
以下のコマンドでwheel形式のパッケージが作成されます。

$ python setup.py sdist_wheel

distというディレクトリの下にpakcagename-1.0.0-py3-none-any.whlと言うようなファイルが出来ます。
これももちろんpipコマンドでインストール可能です。

$ pip install packagename-1.0.0-py3-none-any.whl

rpmパッケージに組み込む

今回のメインです!

Pythonで作ったアプリケーションをrpmファイルにパッケージングしたい時、
ありますよね〜

そんなときは

$ python setup.py bdist_rpm

以上!!

もちろんですけどrpm-buildが入ってないと動きません。これでsetuptoolsがよしなにspecファイルを作ってパッケージをビルドしてくれます。

まとめ

楽ちん♪

ただ、この方法では自分の書いたコードのみしかインストールされません(あたりまえ)。
依存ライブラリなどがある場合はwheelパッケージを作り、自分でspecファイルを作りこねくり回さないといけなくなります。

絶賛苦戦中です。

  1. 厳密にはpython標準のconfigparserに依存します

8
7
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
8
7

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?