結論
仮想環境内にあるpythonでカスタムコマンドを実行する必要があるようです。タイトルのようなエラーが発生している場合はサーバーの大元のpythonを実行している可能性があります。
実際に起きたエラー
djangoのカスタムコマンドを作成、それをpythonanywhereのScheduled tasks機能を使って定期実行をしようとしていました。
最初、Scheduled tasksのコマンドの部分に以下のように記述して実行をしようとするとエラーが発生しました。
python /home/(ユーザー名)/(仮想環境名)/manage.py (カスタムコマンド名)
Traceback (most recent call last):
File "/usr/local/lib/python3.10/site-packages/django/core/management/__init__.py", line 259, in fetch_command
app_name = commands[subcommand]
KeyError: 'update_channel_record'
During handling of the above exception, another exception occurred:
Traceback (most recent call last):
File "/home/kabuto64425/kabuto64425.pythonanywhere.com/manage.py", line 15, in <module>
execute_from_command_line(sys.argv)
File "/usr/local/lib/python3.10/site-packages/django/core/management/__init__.py", line 446, in execute_from_command_line
utility.execute()
File "/usr/local/lib/python3.10/site-packages/django/core/management/__init__.py", line 440, in execute
self.fetch_command(subcommand).run_from_argv(self.argv)
File "/usr/local/lib/python3.10/site-packages/django/core/management/__init__.py", line 266, in fetch_command
settings.INSTALLED_APPS
File "/usr/local/lib/python3.10/site-packages/django/conf/__init__.py", line 87, in __getattr__
self._setup(name)
File "/usr/local/lib/python3.10/site-packages/django/conf/__init__.py", line 74, in _setup
self._wrapped = Settings(settings_module)
File "/usr/local/lib/python3.10/site-packages/django/conf/__init__.py", line 183, in __init__
mod = importlib.import_module(self.SETTINGS_MODULE)
File "/usr/local/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 "/home/kabuto64425/kabuto64425.pythonanywhere.com/config/settings.py", line 14, in <module>
from dotenv import load_dotenv
ModuleNotFoundError: No module named 'dotenv'
2023-06-06 11:05:12 -- Completed task, took 6.57 seconds, return code was 1.
logを見る限り、dotenvがインストールされていないということなのですが、それ自体はインストールできていたはずなので疑問に思い調査をしました。
調査
以下の記事が参考になりました。
どうやらScheduled tasksのコマンドで単に「python」と入力して実行すると大元のpythonを実行するようです。そのため、仮想環境内にインストールしたモジュールは持っていないため、エラーになるということだそうです。そこで仮想環境内のpythonを実行できるようにファイルパスまで記述する必要がありました。
調査を踏まえての対策
仮想環境内のpythonを実行できるようにするため以下のようにコマンドを変更します。
/home/(ユーザー名)/.virtualenvs/(仮想環境名)/bin/python /home/(ユーザー名)/(仮想環境名)/manage.py (カスタムコマンド名)
これでエラーが発生することなく定期実行できます。
以上です。