Django命令无法找到命令模块

16 投票
1 回答
7060 浏览
提问于 2025-04-17 12:51

当我在我的应用程序中运行 ./manage.py process_email 时,出现了 ImportError: No module named commands.process_email 的错误。

我的文件夹结构是:

./
├── __init__.py
├── admin.py
├── forms.py
├── management
│   ├── __init__.py
│   └── commands
│       ├── __init.py__
│       └── process_email.py
├── models.py
├── views.py

process_email 命令的源代码是:

from django.core.management.base import BaseCommand, CommandError
from django.conf import settings
from website.event.models import Event

class Command(BaseCommand):

    def handle(self, *args, **options):
        process_email()

def process_email():
    print "processing email" 

而我遇到的错误是:

(website.com)kings@bob-kings-MacBook ~/code/website.com/website $  > ./manage.py  process_email
Traceback (most recent call last):
  File "./manage.py", line 14, in <module>
    execute_manager(settings)
  File "/Users/kings/code/website.com/lib/python2.6/site-packages/django/core/management/__init__.py", line 438, in execute_manager
    utility.execute()
  File "/Users/kings/code/website.com/lib/python2.6/site-packages/django/core/management/__init__.py", line 379, in execute
    self.fetch_command(subcommand).run_from_argv(self.argv)
  File "/Users/kings/code/website.com/lib/python2.6/site-packages/django/core/management/__init__.py", line 261, in fetch_command
    klass = load_command_class(app_name, subcommand)
  File "/Users/kings/code/website.com/lib/python2.6/site-packages/django/core/management/__init__.py", line 67, in load_command_class
    module = import_module('%s.management.commands.%s' % (app_name, name))
  File "/Users/kings/code/website.com/lib/python2.6/site-packages/django/utils/importlib.py", line 35, in import_module
    __import__(name)
ImportError: No module named commands.process_email 

当我运行 ./manage.py 时,确实在“可用子命令”中看到了 process_email。这说明 manage.py 能找到 process_email.py 文件。另外,init.py 是空的(我觉得这没什么大不了的,但还是告诉你一下)。

1 个回答

25

这个__init.py__的名字对吗?我不确定你的文件结构里是不是写错了,还是确实叫这个名字。

在Python中,包含__init__.py文件的文件夹会被当作模块来处理。不过,如果这个文件不存在,Python就不会处理这个文件夹,也就是说它不会处理__init.py__或者这个“模块”。这个文件可以是空的,没问题;但如果里面有内容,你也可以从中导入东西(像Django就经常这样做),而且你还可以定义哪些内容可以被导出到模块外。

撰写回答