0
0

More than 1 year has passed since last update.

pythonanywhereのScheduled tasksでdjangoのカスタムコマンドを実行すると、インストールしたはずのモジュールが無いというエラーが発生する。

Posted at

結論

仮想環境内にあるpythonでカスタムコマンドを実行する必要があるようです。タイトルのようなエラーが発生している場合はサーバーの大元のpythonを実行している可能性があります。

実際に起きたエラー

djangoのカスタムコマンドを作成、それをpythonanywhereのScheduled tasks機能を使って定期実行をしようとしていました。
最初、Scheduled tasksのコマンドの部分に以下のように記述して実行をしようとするとエラーが発生しました。

python /home/(ユーザー名)/(仮想環境名)/manage.py (カスタムコマンド名)
error.log
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 (カスタムコマンド名)

これでエラーが発生することなく定期実行できます。

以上です。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0