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ファイルは単にパッケージのバージョンを書くためだけのものです。
1 |
__version__ = "2019.6.9.dev0" |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
#!/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 |
バージョン番号は相対インポートで__version__.pyからインポートしています。
1 2 3 4 5 |
#!/usr/bin/python3 # -*- coding: utf-8 -*- import sys from . import main sys.exit(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"
0 件のコメント:
コメントを投稿