У меня странная проблема, надеюсь, кто-то сталкивался с ней раньше.
У меня есть собственный сценарий, расположенный по адресу my_project/my_app/scripts/custom_script.py
- Мой желательный вариант использования - передать этому сценарию путь к файлу и обработать его.файл и загрузить / изменить некоторые данные в моей базе данных.
Вот фрагмент этого скрипта:
import django
def setup_django(env):
if env == 'dev':
settings = "my_project.my_project.dev_settings"
elif env == 'stg':
settings = "my_project.my_project.staging_settings"
elif env == 'prod':
settings = "my_project.my_project.prod_settings"
else:
raise ValueError("Invalid choice for --env argument: {}".format(env))
os.environ.setdefault('DJANGO_SETTINGS_MODULE', settings)
django.setup()
def main():
env = 'dev'
setup_django(env)
# Do stuff with my script
Когда я запускаю вышеизложенное из того же virtualenv, что и мой проект, яполучить ошибку ModuleNotFoundError: No module named 'my_app'
Внутри файла настроек:
...
INSTALLED_APPS = [
'my_app',
'django.contrib.admin',
'django.contrib.auth',
...
]
...
Кажется, что когда я вызываю django.setup()
, он идет и анализирует мой файл dev_settings
и находит my_app
в списке INSTALLED_APPS
, затем пытается импортировать его напрямую (например, import my_app
).Это никогда не будет работать, потому что my_app
является подмодулем my_project
(должно быть import my_project.my_app
).Вот пример структуры каталогов:
my_project
├── my_project
│ ├── __init__.py
│ ├── dev_settings.py
│ ├── prod_settings.py
│ ├── staging_settings.py
│ ├── urls.py
│ └── wsgi.py
├── my_app
│ ├── __init__.py
│ ├── admin.py
│ ├── apps.py
│ ├── models.py
│ ├── scripts
│ │ ├── __init__.py
│ │ ├── **custom_script.py**
│ │ └── utils.py
│ ├── tests.py
│ ├── urls.py
│ └── views.py
├── __init__.py
└── manage.py
Этот файл настроек работает нормально с manage.py
, как в runserver
, так и shell
(может найти приложение my_app
просто отлично),Однако внутри custom_script.py
все кажется потерянным.
Есть идеи?