🙆♀️
python ローカル実行時とローカルでインストールした後実行時でimportが成功したりしなかったりする問題
背景
題名のまんまですが、初めて python でとあるツールのwrapperを作っている際に
ローカルで実行、テストしたときは普通に動き
pip install .
したときに import
エラーを吐き、
それを解消した後に python3 -m pytest
をしたらまたエラーを吐き
それを解消した後に pip install .
で ubuntu のシステムに入れた時またimportエラーが発生して大惨事
以上を解消すべく完全な構成と import を考えて結局解消したのでメモ
とあるツール
競プロ用の神ツール 一瞬でテストケースのダウンロード、テストができる
が各問題ごとにしかダウンロードができない
コンテスト一括でテストケースをダウンロードしたいと思ったので作ったwrapper
環境
oj-wrapper on main is 📦 v0.0.1 via 🐍 v3.12.3
❯ python3 --version
Python 3.12.3
❯ pip --version
pip 24.0 from /usr/lib/python3/dist-packages/pip (python 3.12)
❯ cat /etc/lsb-release
1 DISTRIB_ID=Ubuntu
2 DISTRIB_RELEASE=24.04
3 DISTRIB_CODENAME=noble
4 DISTRIB_DESCRIPTION="Ubuntu 24.04 LTS"
構成
❯ pwd
/home/<hoge>/prog/oj-wrapper
❯ ll
├── ojw
│ ├── __init__.py
│ ├── ...
│ ├── problem.py
│ └── scraping.py
│
├── online_judge_tools_wrapper.egg-info
│ └── ...
│
├── pyproject.toml
├── requirements.txt
├── setup.cfg
├── setup.py
├── tests
│ ├── __init__.py
│ ├── ...
│
└── venv
setup.cfg
[metadata]
...
[options.entry_points]
console_scripts =
ojw = ojw.main:main
Makefile
-m で直接 main モジュールを 起動させる
run:
python3 -m ojw.main https://atcoder.jp/contests/abc042
.PHONY: test
test:
python3 -m pytest
ojw/scraping.py
from typing import List
from bs4 import BeautifulSoup as bs
from ojw.problem import Problem # これ!!!
こんな感じでトップレベルのディレクトリから指定して import を行う
tests/tests_scraping.py
import time
from pathlib import Path
import httpx
from ojw.scraping import get_problems_from_task_page # これ!!!
テストのときでも最上位のディレクトリから指定してimport を行う
以上により 開発時ローカルで実行したとき、ローカルの venv にインストールした後に実行したとき、venv を抜けて pip install .
した時とで、 import エラーが起こったり怒らなかったりするエラーが(ひとまず)解消されました
総括
これを調べるのに2時間位かかりましたね
相対とか絶対とか全部無くしてください ちょっと import
が長くなってもいいじゃないですか
今どきさくっと補完してくれるんですから
いろいろな方法で import
できてしまうからこそ面倒なんです
一通りにしておいてくれ
Discussion