SetupTools統合¶
コマンドラインユーティリティを作成する際には,Unix Shebangsではなくsetuptoolsとともに配布されるモジュールとして作成することを提案する.
なぜそんなことをしたのですか。理由はたくさんあります
従来手法の問題の1つは、Pythonインタプリタがロードした最初のモジュールの名前が正しくないことです。これは小さな問題に聞こえるかもしれないが、それはかなり大きな影響を持っている。
第1のモジュールはその実際の名前で呼び出されるのではないが,インタプリタはそれを名前に再命名する.
__main__
それがそうです。これは完全に有効な名前であるが、別のコードがモジュールから導入されたい場合、その真の名前で2回目の導入をトリガし、突然あなたのコードが2回導入されることを意味する。すべてのプラットフォームが簡単に実行されるわけではない。LinuxおよびOS Xでは、ファイルの先頭に注釈を追加することができます (
#!/usr/bin/env python
)と、スクリプトの動作方式は、実行可能ファイル(実行可能ファイルビットが設定されていると仮定する)と同様である。しかし,これはWindows上では機能しない.Windowsでは、インタプリタをファイル拡張子に関連付けることができます(すべてのコンテンツが.py
Pythonインタプリタにより実行され),Virtualenvでこのスクリプトを使用するためには問題がある.実際,Virtualenvでスクリプトを実行することもOSXやLinuxの問題である.従来の方法を使用する場合、Virtualenv全体を活性化して、正しいPythonインタプリタを使用する必要があります。ユーザーにはあまり親切ではありません。
スクリプトがPythonモジュールである場合にのみ、主な技法が有効です。もしあなたのアプリケーションが大きすぎて、あなたがカバンを使い始めたいなら、問題があります。
序言:序言¶
Setuptoolsとスクリプトをバンドルするには、Pythonパッケージのスクリプトと setup.py
ファイルです。
このようなディレクトリ構造を想像してみてください
yourscript.py
setup.py
内容 yourscript.py
:
import click
@click.command()
def cli():
"""Example script."""
click.echo('Hello World!')
内容 setup.py
:
from setuptools import setup
setup(
name='yourscript',
version='0.1.0',
py_modules=['yourscript'],
install_requires=[
'Click',
],
entry_points={
'console_scripts': [
'yourscript = yourscript:cli',
],
},
)
不思議なことに entry_points
パラメータ以下 console_scripts
各行は、1つのコンソールスクリプトを識別します。等号前の第一部 (=
)は生成すべきスクリプトの名前であり,第2部分は導入経路,直後コロンである. (:
)Clickコマンドを使用します。
そのとおりです。
テストスクリプト.¶
スクリプトをテストするには、新しいviralenvを作成し、ソフトウェアパッケージをインストールすることができます。
$ virtualenv venv
$ . venv/bin/activate
$ pip install --editable .
その後、あなたの命令は利用できるはずです。
$ yourscript
Hello World!
バッグの中のスクリプト¶
スクリプトが増加しており、Pythonパッケージに含まれるスクリプトに切り替えたい場合、必要な変更は非常に少ないです。ディレクトリ構造を以下のように変更すると仮定しましょう。
project/
yourpackage/
__init__.py
main.py
utils.py
scripts/
__init__.py
yourscript.py
setup.py
この場合には、使用するのではなく py_modules
あなたの setup.py
ご利用いただける書類 packages
およびsetuptoolsの自動パケット検索サポート.それ以外にも,他のパケットデータを含むことを提案する.
これらは修正された内容になります setup.py
:
from setuptools import setup, find_packages
setup(
name='yourpackage',
version='0.1.0',
packages=find_packages(),
include_package_data=True,
install_requires=[
'Click',
],
entry_points={
'console_scripts': [
'yourscript = yourpackage.scripts.yourscript:cli',
],
},
)