| 私のpython覚書 |
|
python覚書
ubuntu覚書
php覚書
コマンド覚書
その他の覚書
|
| 1 | frozen環境では'__file__'変数が使えない 実行中のスクリプトの所在ディレクトリは
os.path.abspath(os.path.dirname(__file__))
のように取得するが、frozen環境では'__file__'変数が使えないので、frozen環境か否かで処理を分けることになる。
例えば:
if getattr(sys,'frozen',False):
#sysオブジェクトにfrozenアトリビュートが存在すればその値が
#返されて、frozenアトリビュートが存在しなければFalseが返る
#Trueならfrozen環境ということになる
workdir = os.path.dirname(sys.executable)
else:
#frozen環境ではない。
#realpathを使った例
workdir = os.path.dirname(os.path.realpath(__file__))
|
| 2 | pip(python3ではpip3)でpythonモジュールをインストールすると正常にインストールされたないことが多いような気がする。
私個人の環境によるのかも知れないが、ネット検索で情報を調べるとモジュールのインストール例はほとんどpipなので困る。
pipでインストールしたとき、インストールに失敗するなら問題はないのだが、一見インストールが成功したような終わり方をするのが問題だ。インストールしたモジュールをimportすることはできるが、モジュールは正常に実行できない状態になっている。
結局、pipでアンインストールしたあとでaptでインストールするはめになる。
例えば、pythyon3用のpyperclipをインストールする場合:
sudo apt install python3-pyperclip
これなら正常にインストールできる。
|
| 3 | デフォルト引数が設定されている関数
def test(op1=1,op2=2,op3=3):
print(op1,op2,op3)
呼び出し用の引数準備
opdic = {'op1':10,'op2':20}
呼び出し(*が2個必要)
test(**opdic)
-->10 20 3
|
| 4 | python os.walk(dirname)
for dirpath,dirs,files in os.walk(dirname):
pass
os.walk()で階層を下にたどる際にイテレータから返されるdirsリストの要素をforループの中で削除やスライスすることで、後続するos.walk()の対象ディレクトリを制限できる。
要素の削除ならdirs.remove(xxx)となるが、あくまでos.walk()由来のオブジェクト内のメソッド等で要素を削除等すること。
別のリストオブジェクトを生成してdirs変数に代入しても後続するos.walk()の動作には影響を与えないので注意が必要。
|
| 5 | 仮想環境が必要なディレクトリで次のコマンドで仮想環境を作成
python3 -m venv <sample_env>
<sample env>のディレクトリが作成されてその中に標準ライブラリだけのpython3が構築される。
次のコマンドで仮想環境に入る(ただし、Linux環境等)
source <sample_env>/bin/activate
プロンプトの先頭文字が(<sample_env>)となって仮想環境に入ったことがわかる。
標準以外のパッケージやモジュールをpip3でインストール。
インストールされるのは仮想環境の中だけなので外部には影響しない。
次のコマンドで仮想環境から抜ける
deactivate
ちなみに、IDLEが必要な場合は、仮想環境のプロンプトから次のように起動するらしい。
python3 -m idlelib.idle
※pyinstallerで固めた際、サイズがでかくなったので余計なライブラリがなければ小さくなるかと思って仮想環境を試してみたが、全く効果なかった。
一時的なパッケージ、ライブラリを試すのにはよいが、いちいち環境を替えまくるのは面倒だ。
|
| 6 | pythonで一般的なコピー、カット、ペーストの動作を実現しようとしてpyperclipモジュールを使ったら、pyinstallerで固めると300MBを超えるサイズになってしまう。
普通のクリップボードのコピー、カット、ペースト動作をするだけなら、pyperclipを使わなくてもtkinterのUniversal widget methodsで十分。
w.clipboard_get()、w.clipboard_clear()、w.clipboard_append()
tkinterのメソッドを使ってpyinstallerで固めると10分の1以下の20MB程度になる。
|
| 8 | rootウィンドウのサイズ変更イベントで内包するウィジェットのサイズを変更するためrootウィンドウのサイズを取得する必要があったので。
root.geometry()メソッドで"WxH+X+Y"形式で取得できる。
解説によるとrootのサイズ変更イベント<Configure>で渡されるEv.widthとEv.heightでサイズが取得できるとされているが何故か正常なサイズを得られない。
また、root['width'],root['height']の値はマウス操作によるサイズ変更の結果を反映しない。
|
| 9 | Column and row configuration options for the .grid() geometry manager
w.columnconfigure(0, weight=3)
w.columnconfigure(1, weight=1)
tkinter解説
「Other grid management methods」あたりを参照のこと
|
| 10 | tkinter の Named Font(名前付けフォント、定義済みフォント)の使い方 tkinter の Named Font(名前付けフォント、定義済みフォント)の使い方
from tkinter import *
from tkinter import font
#Tk()の環境下であることが必要
root=Tk()
#次のコマンドで次の名前付けフォントが出力される(IDLE)。
font.names()
('TkCaptionFont', 'TkSmallCaptionFont', 'TkTooltipFont', 'TkFixedFont', 'TkHeadingFont', 'TkMenuFont', 'TkIconFont', 'TkTextFont', 'TkDefaultFont')
#利用したかったのは'TkFixedFont'(等幅フォント)
#次のコマンドでフォントを使えるようにする。詳しいことはわからん。
myfont = font.nametofont('TkFixedFont')
#また、このフォントの詳細は次のコマンドで辞書として返される。
myfont.actual()
myfont.metrics()
#myfontのフォントのサイズを変更(10ポイントに)するには次のようにする。
myfont['size'] = 10
#フォントが指定できるウィジェット定義のところでfont=で使う。
#例えば、Textウィジェットなら
txw = Text(parent,font=myfont,..)
|
| 11 | print('\r'+'表示文字列',end='')
'\r':出力位置を行頭に移動(キャリッジリターン)
end='':デフォルトでは'\n'が最後に出力される。''にすることでラインフィードさせない
。
※pythonのIDLEでは'\r'の効果なし。
|
| 7 | tkinterのTextウィジットのサイズ固定について Textウィジットを行数・一行文字数を指定して作成すると、フォントのサイズを変更する度にTextウィジットの大きさが変化する。
Textウィジットのサイズをフォントサイズに関らず固定するためには、
1.フレームをheight、widthオプションを設定して作成する。
2.上記のフレーム上にTextウィジットを行数・文字数を指定せずに作成する。
3.Textウィジットをpack()する際にfill=BOTHオプションでフレーム一杯に配置する。
4.フレームをpack()
5.フレームに.pack_propagate(0)メソッドを適用する。
※フレームのheight、widthオプションは.pack_propagate(0)や.grid_propagate(0)メソッドを適用しない場合は無視される。
※grid()で配置する場合はgrid_propagate(0)でできるフレームのサイズを固定できるが、フレームに配置したテキストウィジェットのサイズがフレームに納まらない。(当然、テキストウィジェットをgrid()で配置する際にsticky=N+S+W+Eで拡大するように設定しているが)pack(fill=BOTH)で配置するとテキストウィジェットはフレームサイズにちゃんと収まる。
ところで、Textウィジットに隣接してスクロールバーを配置している場合は、この方法を使うとスクロールバーが見えなくなるので、Textウィジットに隣接して配置せずに、Textウィジットが置かれているフレームの外側に配置するようにすること。
|
| 12 | print('\x1b[?25l') カーソル非表示
print('\x1b[?25h') カーソル表示
ちなみに'\x1b'は<ESC>コード
※windowsのコマンドプロンプトでエスケープシーケンスを使いたい場合はあのおぞましいANSI.SYSを組み込んでおく必要があるとのこと。
|
| 13 | tkinterのウィンドウでXボタンを制御する場合:
<toplevel>.protocol('WM_DELETE_WINDOW',<function>)
例えばこんな感じ:
root.protocol('WM_DELETE_WINDOW', closewin)
引数を渡したければlambdaで渡す。こんな感じ:
root.protocol('WM_DELETE_WINDOW',lambda: closewin(arg1,arg2,..))
|
| 14 | ■仮想環境の構築など
・前提
<dirname>:作業ディレクトリ
.venv:<dirname>内に作成される仮想環境用ディレクトリ名(.venv以外でもよい)
<prompt>:仮想環境に入ったときのプロンプト(--prompt以降は任意)
・仮想環境の構築
cd <dirname>
python3 -m venv .venv --prompt <prompt>
・仮想環境への投入
cd <dirname>
source .venv/bin/activate
・仮想環境からの離脱
deactivate
・仮想環境の削除
.venvディレクトリを削除
■仮想環境へのパッケージのインストール(仮想環境モードで)
・通常のパッケージのインストール
pip3 install <パッケージ>
・カレントディレクトリのsetup.pyの確認
pip3 install .
・実際にはインストールせず認識させるだけ(setup.pyの間違いを確認できないのでおすすめできない)
pip3 install -e .
■インストールされたパッケージの所在の確認
pip3 show <packagename>
※ただし、pip3 install -e . でインストールするとLocationに現在のプロジェクトフォルダのあるディレクトリが表示される。
■仮想環境に関する注意点
異なるPC間の仮想環境用ディレクトリやegg-infoディレクトリを混在させないこと。混在により仮想環境に異常が発生した場合は、仮想環境やegg-infoディレクトリを一旦削除して仮想環境を再構築すること。
|
| 16 | クリーンインストールしたubuntu23.10でpythonを使っていたら、pipがパッケージのインストールにvenv仮想環境を強要する。仮想環境でpythonを使うのは配布ファイルを作成したり、実験するときだけなので、普段使いのpythonには普通にパッケージをインストールしたい。
pipが出力するエラーメッセージの最後の方(どうせなら一番最初に書いてほしい)に次のオプションでこの動作をバイパスすると書いてある、もちろん、使用者のリスクを承知の上でと。
--break-system-packages
これで、pip install <package> --break-system-packages とすれば従来どおりの動作となる。
参考にしたサイト(https://pineplanter.moo.jp/non-it-salaryman/2023/05/05/pip-error/)ではこのオプションをいちいちつけなくてもいい方法が紹介されていたけど、pipの基本動作を尊重して今のところはオプションで対応する予定。
|
| 17 | venv仮想環境に外部パッケージをインストールして、pyinstallerで固めたら、アプリ実行時に外部パッケージが見つからずエラーとなり起動しない。
pyinstallerが収集するパッケージはpyinstallerがインストールされた環境にあるパッケージなので、上の状況はpyinstallerが当該仮想環境以外の環境(グローバル環境など)にインストールされている場合に起こる。
pyinstallerを仮想環境毎にインストールするのがいやだけど、今のpipの流れ(仮想環境推奨)ではそういうことになる。
|
| 15 | python imaging library(pil)のfolkであるpillow(pil)のインストールはpillow本体の他にpython3-pil.imagetkのインストールも必要である。
pillowをインストールしたときに自動的にimagetkもインストールしてくれればいいのにと思うけど、なぜか別途インストールの必要がある。
imagetkはpillow本体とtkinterの橋渡しをしてくれるライブラリで、pythonのGUIとして由緒正しいtkinterを使ってイメージを操作するならimagetkのインストールが不可欠。
※※R6.4月、ubuntu23.10を新規インストールしたときpytho3はすでにインストールずみ(最小かどうかは確認していない)であったが、pillowを使ったpythonアプリが動かなかったのでpillowをインストールしようとしたらすでに入っていた。しかし、例のpil.imagetkはやはり入ってなかった。
※2025.10.21 Ubuntu24.04.3をインストールした際にpythonスクリプトがエラーを出すのでとりあえずpillowを入れようとしたがすでに入っている感じだった。(python3.12)。しかし、imagetkは入ってなかったのでpython3-pil.imagetkを追加で入れた。
|
| 18 | python reモジュールにおけるリテラル文字列(r'..')のパターンについて 正規表現の特殊文字である^,|,*,+,?などをターゲット文字列から検索するためには、パターン文字列の中で\を使ってエスケープする必要がある。
一方で、特殊シーケンスとして\d,\wなど一定の文字列に該当する表現があるが、そのままパターン文字列に加えると\がエスケープ記号として解釈されて単なるd,wの検索になる。そのため、\dなどを使う際は、'\\d'として\をエスケープするか、r'\d’として利用する必要がある。
つまり、r''は特殊シーケンスを書きやすく、読みやすくするためなので、r''の中においても正規表現の特殊文字そのものを検索する際の\によるエスケープは必要なのだ。
なお、pythonのreで検索する際にパターン文字列がr''によるリテラル文字列になっていないとエラーにはならないが警告が発せられる。
|