前提
以下Qiitaの続きです。現常駐先では今はPythonもJavascriptも書いていないですが、AI導入関連の作業への参画が今後ありうることを念頭に今も 主な参考資料①~④ をベースにゆるゆる学習を続けています。 主な参考資料① にあるのでReactとかも今は使えないですが、老後に備えてそのうちします。たぶん。
なお、学習はWindowsの私用ノートPC、VScodeで基本的にしています。 また、DjangoプロジェクトのPythonは以下QiitaにあるようにLinuxに入れたものを使っています。※そのため書き損じがあっても大概wslを基本あらかじめ起動しているものとして読んでください。
とりあえず現在、ポートフォリオのホーム画面だけ概ね移行しました。
〇今回途中生じた問題
python-dotenvとか django-extensions とか、poetry add ~で入れて「poetry配下のプロジェクトで使う場合、」settings.pyを少しいじるだけだと上手く働かない外部モジュールがいるらしい
※venvでは大丈夫でした
〇結果として有効だった対応
poetry add ~とは別にGit for WindowsやプロンプトでWSL使った後、pipでLinuxに入れる
※なぜこれでいけるのかは理由は分かっていないし、これが最適解かも分かってないです。
詳細
とりあえず、ホーム画面移行したし、Githubにpushでもするか(´д`)と思ったのですが、SECRET_KEYとか.envに書いて切り分けるべき存在忘れてました😇
※注:Djangoはデフォルトだとプロジェクト作成時点でSECRTE_KEYが以下のsettings.pyに自動生成されるようです。
というわけで、とりあえず
$ poetry add python-dotenv
でインストールして、pyproject.tomlに記述。その後.env、.gitignore作った後、以下のように、load_dotenvとかを決まり文句的に書いてwsl⇒python3 manage.py runserverで開発用サーバーを動かして、とりあえず動くか確認すると
以下のようにエラーがVScodeのターミナルに出ました・・・
Traceback (most recent call last):
File "/usr/lib/python3/dist-packages/django/core/management/base.py", line 354, in run_from_argv
self.execute(*args, **cmd_options)
File "/usr/lib/python3/dist-packages/django/core/management/commands/runserver.py", line 61, in execute
super().execute(*args, **options)
File "/usr/lib/python3/dist-packages/django/core/management/base.py", line 398, in execute
output = self.handle(*args, **options)
File "/usr/lib/python3/dist-packages/django/core/management/commands/runserver.py", line 68, in handle
if not settings.DEBUG and not settings.ALLOWED_HOSTS:
File "/usr/lib/python3/dist-packages/django/conf/__init__.py", line 82, in __getattr__
self._setup(name)
File "/usr/lib/python3/dist-packages/django/conf/__init__.py", line 69, in _setup
self._wrapped = Settings(settings_module)
File "/usr/lib/python3/dist-packages/django/conf/__init__.py", line 170, in __init__
mod = importlib.import_module(self.SETTINGS_MODULE)
File "/usr/lib/python3.10/importlib/__init__.py", line 126, in import_module
return _bootstrap._gcd_import(name[level:], package, level)
File "<frozen importlib._bootstrap>", line 1050, in _gcd_import
File "<frozen importlib._bootstrap>", line 1027, in _find_and_load
File "<frozen importlib._bootstrap>", line 1006, in _find_and_load_unlocked
File "<frozen importlib._bootstrap>", line 688, in _load_unlocked
File "<frozen importlib._bootstrap_external>", line 883, in exec_module
File "<frozen importlib._bootstrap>", line 241, in _call_with_frames_removed
File "/mnt/c/xampp/htdocs/Portfolio/Djangoes/django_portfolio/django_portfolio/settings.py", line 16, in <module>
from dotenv import load_dotenv
ModuleNotFoundError: No module named 'dotenv'
During handling of the above exception, another exception occurred:
~中略~
from dotenv import load_dotenv
ModuleNotFoundError: No module named 'dotenv'
「dotenv」お前さっき入ったんちゃうん??(-_-)・・
〇ちょっと迷走した記録
details
試したこと①:pyproject.tomlを確認
[tool.poetry.dependencies]
python = "^3.11"
pytest = "^8.3.3"
Django = "^5.1.3"
requests = "^2.32.3"
pyocr = "^0.8.5"
pillow = "^11.0.0"
django-tables2 = "^2.7.0"
django-filter = "^24.3"
SpeechRecognition = "^3.11.0"
django-extensions = "^3.2.3"
python-dotenv = "^1.0.1" 👈 いるやん(-_-)・・・
試したこと②:Poetry shell(Poetryのインタラクティブシェル)を使って入っているか確認
※シェル起動時とかに出てくるメッセージは省略しています。
$ poetry shell
$ poetry show python-dotenv
結果、以下のように出力されました
name : python-dotenv
version : 1.0.1
description : Read key-value pairs from a .env file and set them as environment variables
いるやん(-_-)・・・
試したこと③:全て削除してPythonのバージョンを変えてみて、もう一度1からやる
エラー(-_-)・・・
〇結局何が原因だったか
どうもLinux(Ubuntu)の中に、python-dotenvをGit for Windowsとかコマンドプロンプトで別に入れる必要があった
wsl
$ pip install python-dotenv
を使ったら下記Linuxフォルダにdotenvが入り全体もなぜか無事動きました。
なお一度アンインストール&再インストールして再現性をもって実証できたのですが、「このpipで入れたdotenv」はどうも poetry add ~ で入れたものとは別物でフォルダの場所を示すと以下の場所にインストールされるものにあたるようです。
※poetry add ~で入れたものはどこにあるのか
poetry配下のプロジェクトを開いた状態で
wsl
$ poetry env info --path
とpoetryコマンドをたたくと「Linux/Ubuntu(等のディストリビューション)」を省略した状態で以下のようなパスが出てきて、
/home/Linuxで設定したユーザー名/.cache/pypoetry/virtualenvs/プロジェクト名を含む仮想環境(virtualenv)名
実際これをたどるとその奥に以下のようにpoetry add ~ で追加した外部モジュールがどうも入っている「site-packages」というフォルダがあります。
自分は転職活動中後期からPythonの学習を始めて、だいたい1年強になります。
開発環境どうしてるかの変遷をざっと書くとこんな感じです。
①Python学習当初、仮想環境とかマジで何も考えずにローカルのCドライブにひたすら外部ライブラリー・パッケージをpip install
👇
②Progakuで①はさすがにそれは外部ライブラリー・パッケージ間の干渉を考えたときにヤバいことを教えてもらう😇
👇
③venvとかrequirements.txtを覚えて、しばらく venv でしのぐ
👇
④Poetryさんをさわらせ始めていただく👈今ココ
②と③の間で以前ローカルのCドライブに直に入れた外部ライブラリーをひたすらポチポチpip uninstallした記憶があるのですが、実際pip listで確認すると今は以下みたいになっていました。
Linuxに今回のように外部ライブラリーを他に別途pipとかで入れた覚えはないので、おそらくpoetryでLinux内に作った仮想環境内の外部ライブラリーが全て拾われて載っているのではないか??と思っています。
なお今のところ、 poetryが上手くやってくれているのか外部ライブラリー同士の干渉による不具合が起こった記憶はありません。
django-extensionsは、ルーティング調べたり、models.pyをもとにER図を作成したりする等Django開発を効率化するための拡張機能を追加する外部ライブラリーです。本題①を対処しようとして、ちょっと迷走している間にpython-dotenv同様とりあえず
poetry add django-extensions
して入れたつもりになってました。なおこれも本題①同様に Git for Windowsとかで
wsl
$ pip install django-extensions
していなかったのが、ボトルネックになっていました。
なお、django-extensionsは使用する際、プロジェクト作成時にできるデフォルトでできるsettings.py の INSTALLED_APPS の要素に 'django_extensions'を追記する必要があります。
# Application definition
INSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'django_extensions', 👈こんなかんじ、ここはアンダーバーを使うことに注意
'resume', #resumeアプリケーションの登録
'form_components', #form_componentsアプリケーションの登録
]
〇後日、個人的に発見した関連便利コマンド
①poetry配下のプロジェクトにインストールされている外部ライブラリを確認 & それらの依存関係を視覚的に確認
$ poetry show --tree
使うとこんな感じで何が入っているのか見えます。
②poetry配下のプロジェクトに関わっている外部ライブラリー・パッケージがどこにいるかを表すパスを一気に洗い出す
wsl
$ python3 -m site
使うとこんな感じで外部ライブラリー・パッケージ関連ファイルが入っているパスが一気に出てきます。
主な参考資料
①Python Django 4 超入門 掌田津耶乃 (著) 秀和システム
②Pythonで文書処理: 資料のPDF化、文字認識、検索、その他さまざまな作業をプログラミングで解決 北山洋幸(著) カットシステム
③Pythonではじめるゲーム制作超入門 知識ゼロからのプログラミングとアルゴリズムと数学 廣瀬 豪(著) インプレス
④これからのJavaScriptの教科書 モダンJavaScriptを基礎から実用レベルまで 狩野 祐東 (著) SB Creative