Как выполнить команду в консоли из определенного подкаталога?

Как организовать файлы консольных команд из каталога <i>./app/management/commands/</i> так, чтобы их можно было разместить в подкаталогах и вызывать в стиле <i>manage.py subdir1.command1</i>?
  • 22 февраля 2024 г. 8:18
Ответы на вопрос 2
Чтобы выполнить команду в консоли из определенного подкаталога, вы можете использовать следующую комбинацию команд:

1. Сначала перейдите в нужный подкаталог с помощью команды `cd`:

```
cd путь_к_подкаталогу
```

Например:
```
cd ./app/management/commands/
```

2. Затем выполните вашу команду. Например, если вы хотите выполнить команду `python script.py`, то сначала перейдите в каталог, где находится файл `script.py`, а затем выполните команду:

```
python script.py
```

Чтобы организовать файлы консолейых команд из каталога `./app/management/commands/` так, чтобы  их можно было разместить в подкаталогах и вызывать в стиле `manage.py subdir1.command1`, вам следует создать вложенные подкаталоги внутри `./app/management/commands/` и помещать файлы команд в эти подкаталоги.

Например, вы можете создать следующую структуру каталогов:

```
./app
└── management
    └── commands
        ├── subdir1
        │   └── command1.py
        └── subdir2
            └── command2.py
```

Теперь вы можете вызывать команды `command1` и `command2` следующим образом:

```
python manage.py subdir1.command1
python manage.py subdir2.command2
```

Это позволит вам организовать и вызывать команды из различных подкаталогов в удобном и структурированном формате.
В Django каждая консольная команда должна быть модулем, который располагается в определенной структуре каталогов, чтобы Django мог его обнаружить и зарегистрировать. 

Если прям жмет, то можно разместить __init__.py в каждом каталоге до консольной команды, с импортом вида:
from .command1 import Command1

# app/
#    management/
#        __init__.py <-- this import
#        commands/
#            __init__.py <-- and this import
#                command1/
#                    __init__.py <-- and this import

Это позволит Django обнаруживать команды, находящиеся в подкаталогах, но при этом требует, чтобы каждая команда была в своем собственном подкаталоге и имела собственный __init__.py.

Кстати, имя команды которое Вы используете при вызове manage.py, должно соответствовать имени каталога, в котором находится команда. Соответственно, если Вы разместили команду в app/management/commands/subdir1/command1, Вы всё равно вызываете её как manage.py command1, не указывая subdir1. Django не поддерживает вызов команд с использованием точечной нотации для обозначения подкаталогов, как в Вашем примере subdir1.command1.
Похожие вопросы