PyDevプロジェクトでPythonパッケージを作成する

2019-06-09

KDE neonを使おう

t f B! P L
コマンドラインから呼び出すPythonパッケージの作成はPythonモジュールよりちょっと手こずる点がありました。

EclipseでPyDevパースペクティブにします。

File ー> New ー> PyDev Project。


PythonパッケージはPyDevプロジェクト内のsrcフォルダ内に作成することにしました。

srcフォルダを右クリック ー> New ー> PyDev Package。


PyDev Packageを作成しても単に空の__init__.pyファイルが入ったフォルダが作成されるというだけです。

__init__.pyファイルはそのフォルダが通常のパッケージであることを示します。

このファイルに書いたコードはパッケージがインポートされたときに実行されます。


さらに__main__.pyと__version__.pyという空ファイルを作成しました。

__main__.pyファイルはこのパッケージが-mオプションで呼び出されたときに実行されたコードを書きます(29.4. __main__ — トップレベルのスクリプト環境 — Python 3.5.4 ドキュメント)。

__version__.pyファイルは単にパッケージのバージョンを書くためだけのものです。
__version__ = "2019.6.9.dev0"
モジュールスコープの__version__変数にバージョン番号を書いておきます。
#!/usr/bin/python3
# -*- coding: utf-8 -*-
from .__version__ import __version__
def main(argv=None):
 import argparse
 parser = argparse.ArgumentParser(prog=__name__, description='Package example.') 
 parser.add_argument("-r", "--recursive", dest="recurse", action="store_true", help="recurse into subfolders [default: %(default)s]")
 parser.add_argument("-v", "--verbose", dest="verbose", action="count", default=0, help="set verbosity level [default: %(default)s]")
 parser.add_argument("-i", "--include", dest="include", help="only include paths matching this regex pattern. Note: exclude is given preference over include. [default: %(default)s]", metavar="RE" )
 parser.add_argument("-e", "--exclude", dest="exclude", help="exclude paths matching this regex pattern. [default: %(default)s]", metavar="RE" )
 parser.add_argument('-V', '--version', action='version', version=__version__)
 parser.add_argument(dest="paths", help="paths to folder(s) with source file(s) [default: %(default)s]", metavar="path", nargs='+')
 args = parser.parse_args()
 return 0
__init__.pyファイルにはパッケージをインポートしたときに実行したいコードを書けばよいのでコマンドラインから呼び出す処理はここに書く必要はないのですが、-hオプションでパッケージ名を__name__で自動的に取得したいためにここに引数の処理コードを書きます。

バージョン番号は相対インポートで__version__.pyからインポートしています。
#!/usr/bin/python3
# -*- coding: utf-8 -*-
import sys
from . import main
sys.exit(main())
コマンドラインから呼び出されたときに実行される__main__.pyファイルで__init__.pyのmain()を相対インポートで呼び出して実行しています。

python3 -m pkg1 -h

-mオプションでパッケージを呼び出すとこのパッケージが実行できます。
pq@pq-VirtualBox:~/eclipse-workspace/PkgExample/src$ python3 -m pkg1 -h
usage: pkg1 [-h] [-r] [-v] [-i RE] [-e RE] [-V] path [path ...]

Package example.

positional arguments:
  path                 paths to folder(s) with source file(s) [default: None]

optional arguments:
  -h, --help           show this help message and exit
  -r, --recursive      recurse into subfolders [default: False]
  -v, --verbose        set verbosity level [default: 0]
  -i RE, --include RE  only include paths matching this regex pattern. Note:
                       exclude is given preference over include. [default:
                       None]
  -e RE, --exclude RE  exclude paths matching this regex pattern. [default:
                       None]
  -V, --version        show program's version number and exit
pq@pq-VirtualBox:~/eclipse-workspace/PkgExample/src$ python3 -m pkg1 -V
2019.6.9.dev0
パッケージ名もバージョン番号も正しく取得できています。

PyDevからPythonパッケージを呼び出す設定


この設定をしなくてもPyDevからPythonパッケージを呼び出せますが、__main__.pyで相対インポートを使っているとエラーになります。

EclipseのWindow ー> Preferences。

PyDev ー> Run。


Launch modules with "python -m mod.name" instead of "python filename.py"?にチェックします。

Applyをクリック。

これでEclipseで__main__.pyで相対インポートを使っていてもパッケージをRunやDebugできるようになります。

Eclipseから実行するときはPyDev Package Explorerでパッケージフォルダを右クリック ー> Run As ー> Python Run、でできます。

デバッグも同様にしてDebug As ー> Python Runでできます。

エディタ画面では__init__.pyがパッケージ名のタブで表示されますが、このファイルをRunしても相対インポートができないのでModuleNotFoundErrorになって実行できません。

この設定はPyDev 4.4.0以降で実装されたようです。

As many comments/questions/rants on SO and other places will tell you, Python3 packages using relative imports want to be run from a central __main__.py file. In the case where a module, say "modA"

ブログ検索 by Blogger

Translate

最近のコメント

Created by Calendar Gadget

QooQ