setup.pyとは何ですか?


992

誰もsetup.pyがそれをどのように構成または使用できるかを説明できますか?


7
エリック:すべてを組み合わせたより良い例は有益です
Das.Rot

1
私にとって、ダウンロードしたパッケージをパッケージマネージャーに向けるのではなく、抽出したパッケージをインストールしてスクリプトを実行する方法はいつも奇妙に感じられます。それはもっと自然でしょう。stackoverflow.com/questions/1471994/what-is-setup-py/...
大佐がパニック

回答:


694

setup.py これは通常、インストールしようとしているモジュール/パッケージが、Pythonモジュールの配布の標準であるDistutilsでパッケージ化および配布されていることを通知するpythonファイルです。

これにより、Pythonパッケージを簡単にインストールできます。多くの場合、これで十分です:

$ pip install . 

pipsetup.pyを使用してモジュールをインストールします。setup.py直接呼び出すことは避けてください。

https://docs.python.org/3/installing/index.html#installing-index


9
このモジュールの作成または処理方法に関する知識を共有していただければ幸いです。たとえば、基本的なモジュールを作成する方法、または./mymodule/libs/からインポートする./mymodule/binでスクリプトをテストする方法
Paulo Oliveira

7
@PauloOliveira Distutilsについて説明しているPythonモジュールの配布を参照してください具体的には、2 . セットアップスクリプトの記述を参照してください。
Yous

4
python setup.py installは絶対に使用しないでください!それはあなたのバージョン管理を壊します!stackoverflow.com/questions/4324558/...
devinbost

2
@MikeS回避策が何かはわかりませんが、setup.pyを実行すると、何時間ものクリーンアップを必要とする悪夢のような問題が発生したことがわかります。私は、pipまたはcondaを使用したビルド/バンドルが解決策になると思います。
devinbost 2017

3
あなたはへのリンク変更することができますdocs.python.org/3/installing/index.html非レガシードキュメントリンクで、そしてまた、へのリンクを追加するのが良いでしょうpackaging.python.org/tutorials/distributing- packages /#setup-pysetup.pyファイルの目的を説明します。
Alvaro Gutierrez Perez

493

他のプロジェクトや[I] Pythonプロンプトからパッケージをインポートできるようfooに、マシンにpythonパッケージをインストールするのに役立ちます(にもインストールできますvirtualenvfoo

等の同様の仕事をpipeasy_installます、


使用する setup.py

いくつかの定義から始めましょう:

パッケージ - __init__.pyファイルを含むフォルダー/ディレクトリ。
モジュール - .py拡張子が付いた有効なPythonファイル。
配布 -1つのパッケージと他のパッケージおよびモジュールとの関係

という名前のパッケージをインストールするとしますfoo。その後、あなたは、

$ git clone https://github.com/user/foo  
$ cd foo
$ python setup.py install

代わりに、実際にインストールしたくないが、それでも使用したい場合。次に、

$ python setup.py develop  

このコマンドは、物をコピーする代わりに、サイトパッケージ内のソースディレクトリへのシンボリックリンクを作成します。このため、非常に高速です(特に大きなパッケージの場合)。


作成 setup.py

あなたがあなたのようなパッケージツリーを持っているなら、

foo
├── foo
   ├── data_struct.py
   ├── __init__.py
   └── internals.py
├── README
├── requirements.txt
└── setup.py

次に、setup.pyスクリプトで次のようにして、一部のマシンにインストールできるようにします。

from setuptools import setup

setup(
   name='foo',
   version='1.0',
   description='A useful module',
   author='Man Foo',
   author_email='foomail@foo.com',
   packages=['foo'],  #same as name
   install_requires=['bar', 'greek'], #external packages as dependencies
)

代わりに、パッケージツリーが以下のようにより複雑な場合:

foo
├── foo
   ├── data_struct.py
   ├── __init__.py
   └── internals.py
├── README
├── requirements.txt
├── scripts
   ├── cool
   └── skype
└── setup.py

次に、setup.pyこの場合のようになります:

from setuptools import setup

setup(
   name='foo',
   version='1.0',
   description='A useful module',
   author='Man Foo',
   author_email='foomail@foo.com',
   packages=['foo'],  #same as name
   install_requires=['bar', 'greek'], #external packages as dependencies
   scripts=[
            'scripts/cool',
            'scripts/skype',
           ]
)

setup.py)にコンテンツを追加して、適切なものにしてください

from setuptools import setup

with open("README", 'r') as f:
    long_description = f.read()

setup(
   name='foo',
   version='1.0',
   description='A useful module',
   license="MIT",
   long_description=long_description,
   author='Man Foo',
   author_email='foomail@foo.com',
   url="http://www.foopackage.com/",
   packages=['foo'],  #same as name
   install_requires=['bar', 'greek'], #external packages as dependencies
   scripts=[
            'scripts/cool',
            'scripts/skype',
           ]
)

long_descriptionで使用されているpypi.orgあなたのパッケージのREADMEの説明として。


そして最後に、パッケージをPyPi.orgにアップロードして、他の人がを使用してパッケージをインストールできるようにしますpip install yourpackage

最初のステップは、以下を使用してpypiでパッケージ名とスペースを要求することです:

$ python setup.py register

パッケージ名を登録すると、だれもそれを要求または使用できなくなります。登録が成功したら、パッケージをそこに(クラウドに)アップロードする必要があります。

$ python setup.py upload

オプションで、次の方法でパッケージに署名することもできますGPG

$ python setup.py --sign upload

おまけsetup.py実際のプロジェクトのサンプルをこちらからご覧ください:torchvision-setup.py


12
Kenneth Reitz(由緒あるの作者requests)は、setup.pyの良い例を明示的に示すこのプロジェクトを持っています-github.com/kennethreitz/setup.py
boweeb

サブパッケージ、つまりパッケージ内にモジュールがあるフォルダについてはどうですか?
fhchl

1
@ kmario23いい説明ありがとうございます!
Dinko Pehar、

1
私はこの答えが大好きです
SW_user2953243

1
@ SW_user2953243お役に立ててうれしいです:)
kmario23

98

setup.pyマルチプラットフォームのインストーラーとmakeファイルに対するPythonの答えです。

コマンドラインのインストールに慣れている場合は、にmake && make install変換されpython setup.py build && python setup.py installます。

一部のパッケージは純粋なPythonであり、バイトコンパイルのみです。その他には、ネイティブコードが含まれている場合があります。これには、ネイティブコンパイラ(gccまたはcl)とPythonインターフェースモジュール(swigまたはpyrex)が必要です。


1
したがって、上記のアナロジーによれば、モジュールのビルドが何らかの理由で失敗した場合、setup.pyスクリプトをいじくり回します...正しいですか?
MonaLisaOverdrive 2015年

1
はい、あなたが見ることができるいくつかの設定ファイルがあるかもしれません。
whatnick

3
私が間違っている場合は訂正してください。ただし、2つの間にわずかな違いがあると思います。python setup.py install 実際にpython setup.py build最初に実行されます(特定の場合を除いて、個別に実行する必要はありません)。をmake実行する前に、常に手動で実行する必要があると思いますmake install
joelostblom 2015

6
@cheflo実際にmakeは特定のパラメーター(または順序付け)は必要ありません。Makefile使用可能な「ターゲット」(およびそれらを呼び出す必要がある順序)の作成者次第です。ベアMakefilesは(通常)移植性が低いため、./configure(autotools)やcmake .(cmake)などのコマンドを使用して生成される傾向があり、そのため、これらのプログラムでmake前に明示的に実行する必要があるかどうかを定義する必要がありますmake install
ntninja

3
docs.python.org/3/installing/index.htmlのドキュメントに従って、setup.pyを今後も使用する必要があるかどうかを教えてくれる人が必要です。 「distutilsの直接使用は段階的に廃止されます... 」
Kemin Zhou


20

setup.py通常、ライブラリまたはプログラムに同梱されているPythonスクリプトで、その言語で書かれています。その目的は、ソフトウェアの正しいインストールです。

多くのパッケージは、と組み合わせてdistutilsフレームワークを使用しsetup.pyます。

http://docs.python.org/distutils/


19

setup.pyは2つのシナリオで使用できます。最初に、Pythonパッケージをインストールします。次に、独自のPythonパッケージを作成します。通常、標準のPythonパッケージには、setup.py、setup.cfg、Manifest.inなどの重要なファイルがいくつかあります。Pythonパッケージを作成するとき、これらの3つのファイルは、(egg-infoフォルダーの下のPKG-INFOのコンテンツ)名前、バージョン、説明、その他の必要なインストール(通常は.txtファイル)、およびその他のいくつかのパラメーターを決定します。setup.cfgは、パッケージの作成中にsetup.pyによって読み取られます(tar.gzの場合もあります)。Manifest.inは、パッケージに何を含めるかを定義できる場所です。とにかく、あなたはsetup.pyを使ってたくさんのことをすることができます

python setup.py build
python setup.py install
python setup.py sdist <distname> upload [-r urltorepo]  (to upload package to pypi or local repo)

setup.pyで使用できる他のコマンドがたくさんあります。助けを求めて

python setup.py --help-commands

をありがとうpython setup.py --help-commands。setup.pyを掘り下げるときに非常に役立ちます。
Palec、

8

setup.pyターミナル(Mac、Linux)またはコマンドプロンプト(Windows)を開いてパッケージをダウンロードする場合。cd タブボタンを使用して支援することにより、ファイルをダウンロードしたフォルダーのあるフォルダーへのパスを設定しますsetup.py

iMac:~ user $ cd path/pakagefolderwithsetupfile/

Enterキーを押すと、次のように表示されます。

iMac:pakagefolderwithsetupfile user$

次に、この後に入力しますpython setup.py install

iMac:pakagefolderwithsetupfile user$ python setup.py install

を押しenterます。できた!


7

ダウンロードしたPythonパッケージをインストールするには、アーカイブを抽出し、内部でsetup.pyスクリプトを実行します。

python setup.py install

私にとって、これはいつも変わった感じがしました。RubyやNodejsで行うように、ダウンロードでパッケージマネージャーを指定するほうが自然です。gem install rails-4.1.1.gem

パッケージマネージャーも、使い慣れていて信頼できるので、より快適です。一方、setup.pyパッケージに固有であるため、どちらも斬新です。「私はこのsetup.pyが過去に使用した他のコマンドと同じコマンドを使用することを信頼する」という慣習への信仰を要求します。それは精神的な意志力に対する残念な税金です。

setup.pyワークフローはパッケージマネージャーよりも安全性が低いと言っているわけではありませんが(Pipは内部でsetup.pyを実行するだけだと理解しています)、確かにそれは奇妙で不快なものだと感じています。同じパッケージマネージャーアプリケーションに対するすべてのコマンドに調和があります。あなたもそれが好きになるかもしれません。


1
次に、easy_installなどを使用できます。ところで、Pythonにはルビーの宝石に似た卵があります。
PavelŠimerda2014

7

setup.py他と同様のPythonファイルです。setup.py各スクリプトに異なる手順が存在しないように、規則に従って名前が付けられている場合を除いて、任意の名前を付けることができます。

最も頻繁setup.pyに使用されるのはPythonモジュールのインストールですが、その他の目的で使用されます。

モジュール:

おそらくこれはsetup.py、モジュールでのisの最も有名な使用法です。これらはを使用してインストールできますがpip、古いバージョンのPythonにはpipデフォルトで含まれていないため、個別にインストールする必要がありました。

モジュールをインストールしたいがインストールしたくない場合はpipsetup.pyファイルからモジュールをインストールするしかありませんでした。これはを介して実現できますpython setup.py install。これにより、Pythonモジュールがルートディクショナリにインストールされます(なしpipeasy_installect)。

この方法は、pipが失敗したときによく使用されます。たとえば、希望するパッケージの正しいPythonバージョンがpipおそらくメンテナンスされていないために利用できない場合、ソースをダウンロードしてpython setup.py install実行すると、コンパイルされたバイナリが必要な場合を除いて、同じことを実行します(ただし、 Pythonバージョン-エラーが返されない限り)。

の別の用途はsetup.py、ソースからパッケージをインストールすることです。モジュールがまだ開発中の場合、wheelファイルは利用できません。インストールする唯一の方法は、ソースから直接インストールすることです。

Python拡張機能の構築:

ビルドされたモジュールは、distutilsセットアップスクリプトを使用して、配布可能なモジュールに変換できます。ビルドしたら、上記のコマンドを使用してインストールできます。

セットアップスクリプトは簡単に構築でき、ファイルが適切に構成されたら、実行することでコンパイルできますpython setup.py build(すべてのコマンドのリンクを参照)。

繰り返しになりますがsetup.py、使いやすさと慣例により名前が付けられていますが、どのような名前でもかまいません。

Cython:

setup.pyファイルのもう1つの有名な使用法として、コンパイルされた拡張機能があります。これらには、ユーザー定義の値を持つセットアップスクリプトが必要です。これらは、高速に(ただし、コンパイルするとプラットフォームに依存します)実行できます。ドキュメントの簡単な例を次に示します

from distutils.core import setup
from Cython.Build import cythonize

setup(
    name = 'Hello world app',
    ext_modules = cythonize("hello.pyx"),
)

これは、 python setup.py build

Cx_Freeze:

セットアップスクリプトを必要とする別のモジュールはcx_Freezeです。これにより、Pythonスクリプトが実行可能ファイルに変換されます。これにより、説明、名前、アイコン、パッケージなどの多くのコマンドを含めたり、除外したりできます。実行すると、配布可能なアプリケーションが作成されます。ドキュメントの例:

import sys
from cx_Freeze import setup, Executable
build_exe_options = {"packages": ["os"], "excludes": ["tkinter"]} 

base = None
if sys.platform == "win32":
    base = "Win32GUI"

setup(  name = "guifoo",
        version = "0.1",
        description = "My GUI application!",
        options = {"build_exe": build_exe_options},
        executables = [Executable("guifoo.py", base=base)])

これはを介してコンパイルできますpython setup.py build

では、setup.pyファイルとは何でしょうか。

簡単に言うと、Python環境で何かを構築または構成するスクリプトです。

配布時のパッケージには1つのセットアップスクリプトのみを含める必要がありますが、いくつかを組み合わせて1つのセットアップスクリプトにすることも珍しくありません。これには多くの場合が含まれますdistutilsが、常にではないことに注意してください(最後の例で示したとおり)覚えておくべきことは、何らかの方法でPythonパッケージ/スクリプトを構成するだけです。

名前が付けられるため、ビルドまたはインストール時に常に同じコマンドを使用できます。


6

簡単にするために、setup.pyは"__main__"インストール関数を呼び出すときと同じように実行されます。setup.py内に、パッケージのインストールに必要なすべてのものを配置する必要があります。

一般的なsetup.py関数

次の2つのセクションでは、多くのsetup.pyモジュールが持つ2つのことについて説明します。

setuptools.setup

この関数を使用すると、プロジェクトの名前、バージョンなどのプロジェクト属性を指定できます。最も重要なのは、この関数を使用すると、適切にパッケージ化されている他の関数をインストールできます。setuptools.setupの例については、このWebページを参照してください。setuptools.setupの

これらの属性により、次のタイプのパッケージをインストールできます。

  • プロジェクトにインポートされ、setuptools.findpackagesを使用してPyPIにリストされているパッケージ:

    packages=find_packages(exclude=["docs","tests", ".gitignore", "README.rst","DESCRIPTION.rst"])

  • PyPIにないパッケージですが、dependency_linksを使用してURLからダウンロードできます

    dependency_links=["http://peak.telecommunity.com/snapshots/",]

カスタム関数

理想的な世界でsetuptools.setupは、あなたのためにすべてを扱います。残念ながら、これは常に当てはまるとは限りません。場合によっては、サブプロセスコマンドを使用して依存関係をインストールするなど、特定のことを実行して、インストールするシステムをパッケージに適した状態にする必要があります。これを回避しようとすると、これらの機能は混乱し、OSディストリビューションの間で異なることがよくあります。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.