Page Top
Python2 Thirdparty

Thirdparty

pipでインストールすると、デフォルトでは site-packages に配置される。
インストール先を変更できるが、パッケージを使うときはなるべく同じディレクトリにまとめた方が良い。

パッケージ名の重複を防げたり、PYTHONPATHに設定するパスが多すぎると、
パッケージの検索に時間がかかり、アプリケーションの起動が遅くなる。

PySideもサードパーティ製になるが、別言語と言っていいぐらい情報量多いので別ページに記載。

numpy

画像を扱うなら必須になると言ってもいいライブラリ。ndarray配列が強力。
nan inf を扱えるのも特徴。

参考

note.nkmk.me
https://note.nkmk.me/

numpy で nan と数値の比較に関する warning を出さないようにする
https://qiita.com/f0o0o/items/61e4b62a03801b73370e

Pillow

Pillowは、PILのフォーク(派生版)らしいです。
PILは、2011年に開発中止してるらしいので、後継版とも言えるかも。

こいつのおかげで、イメージ操作がシンプルに出来る。
自分で頑張る場合は、numpy使う事になる。

Pillow内でも、ndarrayがよく使われてる。

py2exe

Python2を使ってる間は、スタンドアローンアプリを作る際にお世話になる。
他にも、Pyinstallerとかあるが、ファイルサイズが肥大化しがちなのであまり使ってない。

Python3になると、py2exeがなくなるので、PyinstallerNuitkaにお世話になりそうだが、
移行してから考えることにしてる。

参考

http://blawat2015.no-ip.com/~mieki256/diary/201210021.html

アイコン

PySide.icoなどの画像ファイルをリソースに含めても、pythonからは認識するが、
exeにすると読み込めなくなる。インストール先に、dllが別ファイルであるので一緒に含める必要がある。

<Pythonインストールディレクトリ>\site-packages\PySide\plugins\imageformats

from distutils.core import setup
setup(
    data_files = [
        (r'.\imageformats', [
            r"{}\plugins\imageformats\qico4.dll".format(pysideDir),
            r"{}\plugins\imageformats\qgif4.dll".format(pysideDir),
            ]),
        ],
    # 他省略
    )

マルチプロセスエラー

Unknown option: --

pythonのmultiprocessingは、実プロセスを複数起動するので、
exe化する時は、 __main__に以下のコマンドが必要。

multiprocessing.freeze_support()

multiprocessing.set_executable も試したが、python.exeの切り替えは出来ても、
freeze_supportが無効になってしまって、対応策がわからないのでオミット。

PILのインポートエラー

ImportError, "No module named " + qname

と出る場合は、以下の部分をコメントアウトする。
オリジナルを変更したくない場合は、コンパイル用の環境を作ってパスを通す。

.\python\v2.7.15\Lib\site-packages\PIL\__init__.py

__doc__ = __doc__.format(__version__)  # include version in docstring

相対パスエラー

ImportError, "relative importpath too deep"

batファイルで、py2exeに渡す.pyファイルの中に、相対で読まれるまれてるモジュールがあると出るエラー。
パッケージ内で使う分には問題なさそう。パッケージ内に呼び出し用の.pyを置いてる場合は注意。

# from . import define
# ↓
from package import define

DLLパス

DLLが見つからないエラーが出る時は、以下を %PATH% に追加。

<python>\v2.7.15\DLLs
<site-packages>\numpy\.libs

コンパイル

パッケージで作成してる場合は、__main__.pyを利用すると邪魔にならなくていい。
__main__.pyを作っておけば、python.exe-mフラグでテストできるようになる。
これだけでもアプリケーションっぽい動作するので、デバッグモード時は切り替えたりとかもあり。

python.exe -m "package_name"

コンパイルする時は、py2exeのオプションで、script部分に__main__.pyを指定してする感じ。

# _setup.py 色々割愛

console_option = {
    'script': r'{}\__main__.py'.format(scriptDir),
    }

setup(
    console = [console_option],
    )
python.exe "_setup.py" py2exe

その他

コンパイルオプションでwindowモードにすると、
テキストに出力しない限りコンソールの内容が確認出来ない状態になるので注意。

stderrに書き込まれると、<exeName>.logが出力される。

Pyinstaller

しばらく使ってましたが、単にファイルを圧縮して、実行時に展開する仕組みらしく、あまりメリット無いので使用をやめました。
代用として、Nuitka使ってます。

Nuitka

pythonスクリプトをEXE化してくれます。Python3からは、py2exeが無いので、こちらにお世話になる予定。
気に入ってるのは、EXEファイルサイズが小さく、windowsネイティブな実行ファイルにしてくれる点です。
コンパイルには、gccや、Visual Studioが必要になりますが、自動的にダウンロードしてくれます。

options

–standalone

EXE以外にも、関連パッケージを含め、一つのフォルダにまとめます。
サイズが大きくなりますが、環境にによる依存が減るので、配布する時に便利です。
オフにした場合、自身のみがEXE化され、インストールされてるpython.dllを使用して動作します。

–onefile

関連する外部パッケージも含めまるごと圧縮した実行ファイルが作成されます。
一見便利ですが、実行時に都度解凍されるので、処理が遅くなります。
配布を楽にする目的以外はデメリットしかないので使わない方がいいです。

MkDocs

markdownから、いい感じにコマンドリファレンスみたいなサイトを作ってくれる、pythonパッケージ。
site-packages\binに、環境変数のPATHを通せば、mkdocs.exeをスタンドアローンでも使える。

スタンドアローンでも使えるので、pythonのバージョンも最新の使って、pipで入れれば簡単に環境が揃う。
python2で頑張ると、テーマがなかったり、pipでコケたりと大変なだけなので、割り切った方が楽だった。

ちなみに、.pyをパースしてdocstringだけ抽出する機能は無いので、そこは自作した。
inspectモジュールで、いい感じにdocstringを拾えるので、後はdirとか使って頑張る感じ。

markdown直接書いて、.mdファイル置いておけば拾ってくれるので、
スクリプトに埋め込みたくない人は、最初からドキュメントを別に分けしまえばいい。

使い方

ルートフォルダ作って、mkdocs.ymlを作成。同階層にdocsフォルダ作成してmarkdown置き場にする。
ルートフォルダをカレントディレクトリにして、mkdocs.exe叩かないと動作しないので注意。

基本的な変更はmkdocs.ymlでほぼ出来る。
以下はデフォルトから変更したところ。

htmlサーバーが無くても、ローカルホスト(mkdocs.exe serve)で見れるので便利。
この辺の説明は詳しく書いてるのがいっぱいあるので割愛。

breaks

改行を書いたまま表示。スペース2個後ろに付けるの嫌な場合は設定。
New Line to Break.の略らしい。略されてるのがわからず、見つけるのに苦労した…。

markdown_extensions:
    - nl2br

theme

色々試したが、右にTOCが欲しいのでmaterialをチョイス。

ダークテーマがよかったので、cssだけ別のを適用。

mkdocs-material-dark-theme
https://github.com/fmaida/mkdocs-material-dark-theme

自分でcssを拡張したい場合は、別ファイルで追加して、
.md-containerみたいなのを探して、書き換えてあげる感じ。

FireFoxとかで、プレビュー中のHTMLを要素の調査で、cssを直接いじるとわかりやすいかった。

theme:
    language: 'ja'
    name: 'material'

extra_css:
    - "styles/extra.css"
    - "styles/style.css"

TOC問題

TOC自体は標準エクステンションなので、mkdocs.ymlで追加できる。

markdown_extensions:
    - toc:
        permalink: True
        separator: "-"
        toc_depth: 3

TOCが1個目の、h1以下のh2以下しか表示されない。
バグかと思ったが、作者的にh1はタイトルだから1個だろ。と譲らない模様。

mkdocs-material issues
https://github.com/squidfunk/mkdocs-material/issues/818

1ページに、複数のh1を保つ場合は、テンプレートから3行を削除すれば、通常のTOCが作れる。
site-packages\material\partials\toc.html
バージョンによって違うかもしれないが7行目付近。

  {% if toc | first is defined and "\x3ch1 id=" in page.content %}
    {% set toc = (toc | first).children %}
  {% endif %}