web-dev-qa-db-ja.com

Pythonモジュール/パッケージを書くには?

私は仕事中の単純なタスクのためにPythonスクリプトを作成してきましたが、他の人が使用するためにそれらをパッケージ化することに本当に煩わされませんでした。これで私はREST AP​​I用のPythonラッパーを作成するように割り当てられました。私はどうやって始めるべきかについて全く考えがなく、助けが必要です。

私が持っているもの:

私は virtualenv 準備ができています、それはまた githubで起動 です、そしてpython用の.gitignoreファイルもあります、そしてさらに、 REST AP​​Iと対話するためにlibrary を要求します。それでおしまい。

これが現在のディレクトリツリーです。

.
├── bin
│   └── /the usual stuff/
├── include
│   └── /the usual stuff/
├── lib
│   └── python2.7
│       └── /the usual stuff/
├── local
│   └── /the usual stuff/
└── README.md

27 directories, 280 files

私がこれまでに作成したのであれば、私は.pyファイルをどこに置くべきかさえ知りません。

私がやりたかったこと:

"pip install ..."でpythonモジュールをインストール可能にする

可能であれば、Pythonモジュールを書く上での一般的なステップバイステップのプロセスが欲しいです。

316
yowmamasita

モジュールはPythonの定義と文を含むファイルです。ファイル名は、モジュール名の末尾に.pyを付けたものです。

hello.pyを作成し、その内容として次の関数を書きます。

def helloworld():
   print "hello"

それならhelloをインポートすることができます:

>>> import hello
>>> hello.helloworld()
'hello'
>>>

多数の.pyファイルをグループ化するには、それらをフォルダーに入れます。 __init__.pyを持つフォルダはpythonによってモジュールと見なされ、それらをパッケージと呼ぶことができます。

|-HelloModule
  |_ __init__.py
  |_ hellomodule.py

あなたは通常の方法であなたのモジュール上のimportステートメントで進むことができます。

詳細は 6.4を参照。パッケージ

382
Anuj

Python 3 - 2015年11月18日更新

受け入れられた回答が役に立つことに気づいたが、私自身の経験に基づいて他の人の利益のためにいくつかの点で拡大したいと思っていた。

モジュール: モジュールはPythonの定義と文を含むファイルです。ファイル名は、モジュール名に拡張子.pyを付加したものです。

モジュールの例 :現在のディレクトリに単一のpythonスクリプトがあるとします。ここでは、これをmymodule.pyと呼びます。

ファイルmymodule.pyには、次のコードが含まれています。

def myfunc():
    print("Hello!")

現在のディレクトリからpython3インタプリタを実行する場合、以下のさまざまな方法でmyfunc関数をインポートして実行できます(通常は次のいずれかを選択します)。

>>> import mymodule
>>> mymodule.myfunc()
Hello!
>>> from mymodule import myfunc
>>> myfunc()
Hello!
>>> from mymodule import *
>>> myfunc()
Hello!

わかりました、それで十分簡単でした。

現在の作業ディレクトリからアドホックに実行するのではなく、モジュールの名前空間を提供するためにこのモジュールを専用の専用フォルダに配置する必要があるとします。これが package の概念を説明する価値があるところです。

Package :パッケージは、「ドット付きモジュール名」を使ってPythonのモジュール名前空間を構造化する方法です。たとえば、モジュール名ABは、Aという名前のパッケージ内でBという名前のサブモジュールを指定します。modulesを使用すると、異なるモジュールの作者が互いのグローバル変数名を気にせずに済みます。 NumPyやPython Imaging Libraryのようなマルチモジュールパッケージで、お互いのモジュール名を気にする必要がなくなりました。

パッケージの例 :次のフォルダとファイルがあるとしましょう。ここで、 mymodule.py は以前と同じで、 __init__.py は空のファイルです。

.
└── mypackage
    ├── __init__.py
    └── mymodule.py

__init__.pyファイルは、Pythonがディレクトリをパッケージを含むものとして扱うようにするために必要です。詳細については、後で提供されるモジュールのドキュメントリンクを参照してください。

私たちの現在の作業ディレクトリは、 mypackage という通常のフォルダの1つ上のレベルです。

$ ls
mypackage

今python3インタプリタを実行している場合は、必要な関数myfuncを含むモジュール mymodule.py をインポートして実行することができます(通常は次のいずれかを選択します)。 ):

>>> import mypackage
>>> from mypackage import mymodule
>>> mymodule.myfunc()
Hello!
>>> import mypackage.mymodule
>>> mypackage.mymodule.myfunc()
Hello!
>>> from mypackage import mymodule
>>> mymodule.myfunc()
Hello!
>>> from mypackage.mymodule import myfunc
>>> myfunc()
Hello!
>>> from mypackage.mymodule import *
>>> myfunc()
Hello!

Python 3を仮定して、 Modules に優れたドキュメンテーションがあります。

パッケージとモジュールの命名規則に関しては、一般的なガイドラインはPEP-0008にあります - Package and Module Names をご覧ください。

モジュールはすべて小文字の短い名前にする必要があります。読みやすさを向上させる場合は、モジュール名にアンダースコアを使用できます。アンダースコアの使用は推奨されていませんが、Pythonパッケージもすべて小文字の短い名前を持つべきです。

204
arcseldon

誰もまだOPのこの質問をカバーしていなかったので:

私がやりたかったこと:

"pip install ..."でpythonモジュールをインストール可能にする

これは、setuptoolstwineを使ってパッケージを準備し、PyPIにアップロードする基本的な手順を示す、絶対的な最小限の例です。

これは/ /の代わりにはならない 少なくともチュートリアルを読む - この非常に基本的な例でカバーされている以上のものがある。

パッケージ自体を作成することはすでに他の答えでここでカバーされているので、私たちはそのステップがカバーされており、私たちのプロジェクト構造はこのようにしていると仮定しよう:

.
└── hellostackoverflow/
    ├── __init__.py
    └── hellostackoverflow.py

パッケージにsetuptoolsを使用するには、ファイルsetup.pyを追加する必要があります。これはプロジェクトのルートフォルダーに入ります。

.
├── setup.py
└── hellostackoverflow/
    ├── __init__.py
    └── hellostackoverflow.py

最低限、パッケージのメタデータを指定します。setup.pyは次のようになります。

from setuptools import setup

setup(
    name='hellostackoverflow',
    version='0.0.1',
    description='a pip-installable package example',
    license='MIT',
    packages=['hellostackoverflow'],
    author='Benjamin Gerfelder',
    author_email='[email protected]',
    keywords=['example'],
    url='https://github.com/bgse/hellostackoverflow'
)

license='MIT'を設定したので、reStructuredText内のLICENCE.txtとしてのreadmeファイルと一緒に、プロジェクト内のコピーをREADME.rstとして含めます。

.
├── LICENCE.txt
├── README.rst
├── setup.py
└── hellostackoverflow/
    ├── __init__.py
    └── hellostackoverflow.py

この時点で、setuptoolsを使用してパッケージ化を開始する準備ができています。まだインストールしていない場合は、pipを使用してインストールできます。

pip install setuptools

それを実行してsource distributionを作成するには、プロジェクトのルートフォルダーで、コマンドラインからsdistを指定してsetup.pyを呼び出します。

python setup.py sdist

これで配布パッケージとEgg-infoが作成され、パッケージはdistになり、このようなフォルダ構造になります。

.
├── dist/
├── hellostackoverflow.Egg-info/
├── LICENCE.txt
├── README.rst
├── setup.py
└── hellostackoverflow/
    ├── __init__.py
    └── hellostackoverflow.py

この時点で、私たちはpipを使ってインストールできるパッケージを持っているので、私たちのプロジェクトルートから(この例のようにすべての名前があると仮定して):

pip install ./dist/hellostackoverflow-0.0.1.tar.gz

すべてうまくいけば、Pythonインタプリタを開くことができます。混乱を避けるためにプロジェクトディレクトリ以外の場所に移動し、光沢のある新しいパッケージを使用してみます。

Python 3.5.2 (default, Sep 14 2017, 22:51:06) 
[GCC 5.4.0 20160609] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> from hellostackoverflow import hellostackoverflow
>>> hellostackoverflow.greeting()
'Hello Stack Overflow!'

パッケージのインストールと動作を確認したので、それをPyPIにアップロードできます。

ライブリポジトリを実験で汚染したくないので、 testingリポジトリ 用のアカウントを作成し、アップロードプロセス用にtwineをインストールします。

pip install twine

アカウントが作成されたら、twineにパッケージのアップロードを指示します。資格情報を要求して、指定されたリポジトリにパッケージをアップロードします。

twine upload --repository-url https://test.pypi.org/legacy/ dist/*

これでPyPIテストレポジトリで自分のアカウントにログインしてしばらくの間新しくアップロードしたパッケージに目を向け、pipを使ってそれをつかむことができます。

pip install --index-url https://test.pypi.org/simple/ hellostackoverflow

ご覧のとおり、基本的なプロセスはそれほど複雑ではありません。私が先に言ったように、ここでカバーされているよりもっと多くのことがあるので、先に進んでくださいそして チュートリアルを読んでください より詳細な説明のために/ /。

155
bgse

選択したコマンドを定義したら、保存したファイルをpythonプログラムファイルのLibフォルダにドラッグアンドドロップするだけです。

>>> import mymodule 
>>> mymodule.myfunc()
9
Dreamatronix

"hello.py"という名前のファイルを作ります。

Python 2.xを使用している場合

def func():
    print "Hello"

Python 3.xを使用している場合

def func():
    print("Hello")

ファイルを実行してください。その後、次のことを試すことができます。

>>> import hello
>>> hello.func()
Hello

少し難しい場合は、次のものを使用できます。

Python 2.xを使用している場合

def say(text):
    print text

Python 3.xを使用している場合

def say(text):
    print(text)

定義の横にある括弧内のものを参照してください。それは重要です。これはdefine内で使用できるものです。

テキスト - あなたがプログラムにあなたが望むものを言わせたいとき、あなたはそれを使うことができます。その名前によると、それはテキストです。あなたがテキストが何を意味するのか知っていることを願っています。それは「言葉」または「文」を意味します。

ファイルを実行してください。 Python 3.xを使用している場合は、次のことを試すことができます。

>>> import hello
>>> hello.say("hi")
hi
>>> from hello import say
>>> say("test")
test

Python 2.xの場合 - Python 3でも同じことがわかりますか?わかりません。 Python 2.xを間違えた場合は訂正してください(私はPython 2を知っていますが、Python 3を使用しています)

4
Kakkoiikun

最初からプロジェクトスケルトンを簡単に始められるようにプロジェクトを作成しました https://github.com/MacHu-GWU/pygitrepo-project

そしてテストプロジェクトを作成することができます、learn_creating_py_packageとしましょう。

のように、さまざまな目的のためにどのコンポーネントが必要かを知ることができます。

  • virtualenvを作成する
  • 自分自身をインストール
  • unittestを実行
  • コードカバレッジを実行する
  • 文書を作成する
  • ドキュメントをデプロイする
  • 異なるPythonバージョンでunittestを実行する
  • pYPIにデプロイする

pygitrepoを使用する利点は、面倒なものが自動的に作成され、あなたのpackage_nameproject_namegithub_accountdocument Host servicewindows or macos or linuxに適応することです。

プロのようなpythonプロジェクトの開発を学ぶのに良い場所です。

これが役立つことを願っています。

ありがとうございました。

1
MacSanhe