Open10

Python備忘録

ichitadonichitadon

パッケージ内のモジュールを個別にインストールできるようにする

名前空間パッケージを使用すればよい。Native namespace packagesを使用した場合は以下のような構成になる。

mynamespace/
    mynamespace-subpackage-a/
        mynamespace/
            subpackage_a/
                __init__.py
        pyproject.toml

    mynamespace-subpackage-b/
        mynamespace/
            subpackage_b/
                __init__.py
            module_b.py
        pyproject.toml

pyproject.toml は以下のような定義にする。

[tool.poetry]
name = "mynamespace.subpackage_a"
version = ...
description = ...
authors = ...
packages = [
    { include = "mynamespace" },
]

参考:
https://packaging.python.org/en/latest/guides/packaging-namespace-packages/

ichitadonichitadon

VSCodeのblackに行の最大文字数を指定する

  1. [ファイル] -> [ユーザ設定] -> [設定] で設定画面を出す。
  2. [設定の検索] に blackを入力して検索する。
  3. Python > Formatting: Black Args に以下を定義する。
--line-length
80
ichitadonichitadon

DataFrameのテストでindexをチェックから外す

assert_frame_equal にはindexのチェックを無視するオプションはないので、reset_indexdrop=True 指定してindexを初期化して比較する。

assert_frame_equal(df_actual.reset_index(drop=True), df_expected.reset_index(drop=True))
ichitadonichitadon

Requestsから受け取った画像データをPillowでロードする

ByteIO経由で Image.open に渡す。

import io

import requests
from PIL import Image

response = requests.get(target_url) # 画像データ取得
image = Image.open(io.BytesIO(response.content))
ichitadonichitadon

Pillowの画像データのRGB値を取得

ロード済みのImageに対して、RGBにconvertした後に Image.getpixel で座標を指定する。

img = Image.open(path)
img = img.convert("RGB")
r,g,b = img.getpixel((x,y))
r,g,b
(160, 210, 255)
ichitadonichitadon

pytestで処理中のprintやloggerの出力を表示させる

printの場合は -s オプションを付与する。

pytest -s .

loggerの場合は --log-cli-level オプションで任意のレベルを指定する。

pytest --log-cli-level=DEBUG .
ichitadonichitadon

pyppeteer で pyppeteer.errors.BrowserError: Browser closed unexpectedly が出る場合の対処

エラーの原因確認

以下のコードで実行することで、launch()実行時のPythonコード実行時のコンソールには出力されないエラーを出力させる。

from pyppeteer.launcher import Launcher
import os

cmd: str = " ".join(Launcher().cmd)
print(f'cmd: {cmd}')
os.system(cmd)

ライブラリが足りていないケースへの対応

launch() でブラウザを起動に失敗する場合は、ブラウザに必要なライブラリが足りていない可能性が高い。以下のコマンドで確認できる。

ldd ~/.local/share/pyppeteer/local-chromium/588429/chrome-linux/chrome | grep 'not found'

not foundと表示されたライブラリをインストールする。

サンドボックスによるエラーの場合

ライブラリが足りているにもかかわらず BrowserError となる場合は、ブラウザのサンドボックスに関係している可能性がある。

No usable sandbox! Update your kernel or see https://chromium.googlesource.com/chromium/src/+/master/docs/linux_suid_sandbox_development.md for more information on developing with the SUID sandbox. If you want to live dangerously and need an immediate workaround, you can try using --no-sandbox.

エラーの原因確認時に上記のようなメッセージが出た場合は、サンドボックスに関する定義を疑う。以下を参考にsetuid sandboxを定義する。

https://github.com/puppeteer/puppeteer/blob/main/docs/troubleshooting.md#alternative-setup-setuid-sandbox

非推奨であるがChromeのサンドボックスを有効にしない方法もある。簡易的に対応するなら以下のオプションを定義する。

launch({"args": ["--no-sandbox"]})

参考:
https://stackoverflow.com/questions/57217924/pyppeteer-errors-browsererror-browser-closed-unexpectedly

https://github.com/puppeteer/puppeteer/blob/main/docs/troubleshooting.md#setting-up-chrome-linux-sandbox

https://rinoguchi.net/2020/08/pyppeteer-manual.html