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
がなくなるので、Pyinstaller
かNuitka
にお世話になりそうだが、
移行してから考えることにしてる。
参考
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 %}