🙆‍♀️

python ローカル実行時とローカルでインストールした後実行時でimportが成功したりしなかったりする問題

2024/05/03に公開

背景

題名のまんまですが、初めて python でとあるツールのwrapperを作っている際に

ローカルで実行、テストしたときは普通に動き
pip install . したときに import エラーを吐き、

それを解消した後に python3 -m pytest をしたらまたエラーを吐き

それを解消した後に pip install . で ubuntu のシステムに入れた時またimportエラーが発生して大惨事

以上を解消すべく完全な構成と import を考えて結局解消したのでメモ

とあるツール

https://github.com/online-judge-tools/oj

競プロ用の神ツール 一瞬でテストケースのダウンロード、テストができる

が各問題ごとにしかダウンロードができない

コンテスト一括でテストケースをダウンロードしたいと思ったので作った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