Python備忘録
特定処理が出力するWarningが出力されないようにする
import warnings
def fxn():
warnings.warn("deprecated", DeprecationWarning)
with warnings.catch_warnings():
warnings.simplefilter("ignore")
fxn()
参考:
パッケージ内のモジュールを個別にインストールできるようにする
名前空間パッケージを使用すればよい。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" },
]
参考:
VSCodeのblackに行の最大文字数を指定する
- [ファイル] -> [ユーザ設定] -> [設定] で設定画面を出す。
- [設定の検索] に
black
を入力して検索する。 -
Python > Formatting: Black Args
に以下を定義する。
--line-length
80
DataFrameのテストでindexをチェックから外す
assert_frame_equal
にはindexのチェックを無視するオプションはないので、reset_index
に drop=True
指定してindexを初期化して比較する。
assert_frame_equal(df_actual.reset_index(drop=True), df_expected.reset_index(drop=True))
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))
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)
pytestで処理中のprintやloggerの出力を表示させる
printの場合は -s
オプションを付与する。
pytest -s .
loggerの場合は --log-cli-level
オプションで任意のレベルを指定する。
pytest --log-cli-level=DEBUG .
pyppeteer.errors.BrowserError: Browser closed unexpectedly
が出る場合の対処
pyppeteer で エラーの原因確認
以下のコードで実行することで、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を定義する。
非推奨であるがChromeのサンドボックスを有効にしない方法もある。簡易的に対応するなら以下のオプションを定義する。
launch({"args": ["--no-sandbox"]})
参考:
asyncio this event loop is already running
が出力される。
pypeteerをJupyterNotebook上で実行する場合、以下をインストール。
pip install nest_asyncio
コードの先頭で以下の定義を行う。
import nest_asyncio
nest_asyncio.apply()
参考:
Poetry自体をアップデートする
poetry update
だとpyproject.tomlの内容をアップデートしようとしてしまうので、以下のコマンドを実行する。
poetry self update
参考: