Merge pull request 'minhasapov_ruslan_lab_2' (#193) from minhasapov_ruslan_lab_2 into main
Reviewed-on: #193
This commit is contained in:
commit
d70e738ef0
2
minhasapov_ruslan_lab_2/.gitignore
vendored
Normal file
2
minhasapov_ruslan_lab_2/.gitignore
vendored
Normal file
@ -0,0 +1,2 @@
|
|||||||
|
data
|
||||||
|
result
|
49
minhasapov_ruslan_lab_2/README.md
Normal file
49
minhasapov_ruslan_lab_2/README.md
Normal file
@ -0,0 +1,49 @@
|
|||||||
|
# Лабораторная работа №2
|
||||||
|
#### ПИбд-42. Минхасапов Руслан.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
#### Задание:
|
||||||
|
В рамках выполнения данной лабораторной работы были выбраны следущие варианты программ:
|
||||||
|
- Программа 1. Вариант 6: Берёт из каталога /var/data случайный файл и перекладывает его в /var/result/data.txt.
|
||||||
|
- Программа 2. Вариант 2: Ищет наименьшее число из файла /var/data/data.txt и сохраняет его третью степень в /var/result/result.txt.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
Исходя из условия задания: *разработать два приложения такие, что результат первого является исходными данными для второго*; - было принято решение для второй программы брать данные из файла */var/result/data.txt*
|
||||||
|
|
||||||
|
Помимо этого, для выполнения первой программы, было решено генерировать файлы в ней же.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
#### При выполнении данной работы были использованы:
|
||||||
|
- Python 3.12
|
||||||
|
- Docker
|
||||||
|
- Docker Compose
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
#### Инструкция:
|
||||||
|
Для запуска необходимо перейдите в директорию *minhasapov_ruslan_lab_2* и выполнить команду:
|
||||||
|
```
|
||||||
|
docker-compose up --build
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
#### Результат
|
||||||
|
```
|
||||||
|
[+] Running 3/3
|
||||||
|
✔ Network minhasapov_ruslan_lab_2_default Created 0.1s
|
||||||
|
✔ Container minhasapov_ruslan_lab_2-app_1-1 Created 0.2s
|
||||||
|
✔ Container minhasapov_ruslan_lab_2-app_2-1 Created 0.1s
|
||||||
|
Attaching to app_1-1, app_2-1
|
||||||
|
app_1-1 | В директории /var/data было создано 18 файлов.
|
||||||
|
app_1-1 | Случайно выбранный файл file_1.txt был скопирован в /var/result/data.txt.
|
||||||
|
app_2-1 | Куб минимального числа (37^3) = 50653 сохранен в /var/result/result.txt.
|
||||||
|
app_1-1 exited with code 0
|
||||||
|
app_2-1 exited with code 0
|
||||||
|
```
|
||||||
|
|
||||||
|
#### Видео-демонстрация работы
|
||||||
|
Доступна по [ссылке](https://disk.yandex.ru/i/Z7Kvlm8dpNSzXg)
|
8
minhasapov_ruslan_lab_2/app_1/Dockerfile
Normal file
8
minhasapov_ruslan_lab_2/app_1/Dockerfile
Normal file
@ -0,0 +1,8 @@
|
|||||||
|
# Образ с Python 3.12
|
||||||
|
FROM python:3.12
|
||||||
|
# Указываем рабочую директорию
|
||||||
|
WORKDIR /app
|
||||||
|
# Копируем в нее файл скрипта
|
||||||
|
COPY app_1.py .
|
||||||
|
# Команда запуска скрипта
|
||||||
|
CMD ["python", "app_1.py"]
|
70
minhasapov_ruslan_lab_2/app_1/app_1.py
Normal file
70
minhasapov_ruslan_lab_2/app_1/app_1.py
Normal file
@ -0,0 +1,70 @@
|
|||||||
|
import os
|
||||||
|
import random
|
||||||
|
import shutil
|
||||||
|
|
||||||
|
# Директории
|
||||||
|
source_dir = "/var/data" # Путь к исходной директории
|
||||||
|
destination_dir = "/var/result" # Путь к директории назначения
|
||||||
|
destination_file = os.path.join(destination_dir, "data.txt") # Путь к файлу назначения
|
||||||
|
|
||||||
|
# Генерация случайного количества файлов со случайными числами
|
||||||
|
def generate_random_files(directory):
|
||||||
|
# Создаем директорию, если она не существует, игнорируя ошибку, если она уже есть
|
||||||
|
os.makedirs(directory, exist_ok=True)
|
||||||
|
|
||||||
|
# Генерируем случайное количество файлов
|
||||||
|
amount_files = random.randint(10, 20)
|
||||||
|
|
||||||
|
# Создаем каждый файл
|
||||||
|
for i in range(1, amount_files + 1):
|
||||||
|
# Формируем путь к файлу
|
||||||
|
file_path = os.path.join(directory, f"file_{i}.txt")
|
||||||
|
|
||||||
|
# Генерируем случайное количество чисел в файле
|
||||||
|
amount_numbers = random.randint(1, 100)
|
||||||
|
|
||||||
|
# Генерируем список случайных чисел, преобразованных в строки
|
||||||
|
numbers = [str(random.randint(1, 100)) for _ in range(amount_numbers)]
|
||||||
|
|
||||||
|
# Записываем числа в файл
|
||||||
|
with open(file_path, "w") as f:
|
||||||
|
f.write("\n".join(numbers))
|
||||||
|
|
||||||
|
print(f"В директории {directory} было создано {amount_files} файлов.")
|
||||||
|
|
||||||
|
# Копирование случайного файла из исходной директории в файл
|
||||||
|
def copy_random_file(source_dir, destination_file):
|
||||||
|
# Создаем директорию назначения, если она не существует
|
||||||
|
os.makedirs(os.path.dirname(destination_file), exist_ok=True)
|
||||||
|
|
||||||
|
# Получаем список файлов в исходной директории
|
||||||
|
files = [
|
||||||
|
f
|
||||||
|
for f in os.listdir(source_dir)
|
||||||
|
if os.path.isfile(os.path.join(source_dir, f))
|
||||||
|
]
|
||||||
|
|
||||||
|
# Проверяем, есть ли файлы в исходной директории
|
||||||
|
if not files:
|
||||||
|
print("В исходном каталоге нет файлов.")
|
||||||
|
return
|
||||||
|
|
||||||
|
# Выбираем случайный файл из списка
|
||||||
|
random_file = random.choice(files)
|
||||||
|
|
||||||
|
# Формируем путь к исходному файлу
|
||||||
|
source_path = os.path.join(source_dir, random_file)
|
||||||
|
|
||||||
|
# Копируем выбранный файл в файл назначения
|
||||||
|
shutil.copy(source_path, destination_file)
|
||||||
|
|
||||||
|
print(f"Случайно выбранный файл {random_file} был скопирован в {destination_file}.")
|
||||||
|
|
||||||
|
|
||||||
|
def main():
|
||||||
|
generate_random_files(source_dir)
|
||||||
|
copy_random_file(source_dir, destination_file)
|
||||||
|
|
||||||
|
|
||||||
|
if __name__ == "__main__":
|
||||||
|
main()
|
8
minhasapov_ruslan_lab_2/app_2/Dockerfile
Normal file
8
minhasapov_ruslan_lab_2/app_2/Dockerfile
Normal file
@ -0,0 +1,8 @@
|
|||||||
|
# Образ с Python 3.12
|
||||||
|
FROM python:3.12
|
||||||
|
# Указываем рабочую директорию
|
||||||
|
WORKDIR /app
|
||||||
|
# Копируем в нее файл скрипта
|
||||||
|
COPY app_2.py .
|
||||||
|
# Команда запуска скрипта
|
||||||
|
CMD ["python", "app_2.py"]
|
36
minhasapov_ruslan_lab_2/app_2/app_2.py
Normal file
36
minhasapov_ruslan_lab_2/app_2/app_2.py
Normal file
@ -0,0 +1,36 @@
|
|||||||
|
import os
|
||||||
|
|
||||||
|
# Пути к файлам
|
||||||
|
data_file = "/var/result/data.txt"
|
||||||
|
result_file = "/var/result/result.txt"
|
||||||
|
|
||||||
|
def calculate_cube(data_file, result_file):
|
||||||
|
try:
|
||||||
|
# Открываем файл и считываем строки
|
||||||
|
with open(data_file, 'r') as f:
|
||||||
|
numbers = f.readlines()
|
||||||
|
|
||||||
|
# Преобразуем строки в числа, игнорируя нечисловые значения
|
||||||
|
numbers = [int(num.strip()) for num in numbers if num.strip().isdigit()]
|
||||||
|
|
||||||
|
if not numbers:
|
||||||
|
print("Файл не содержит чисел.")
|
||||||
|
return
|
||||||
|
|
||||||
|
min_number = min(numbers)
|
||||||
|
cube = min_number ** 3
|
||||||
|
|
||||||
|
# Записываем результат в файл
|
||||||
|
with open(result_file, 'w') as f:
|
||||||
|
f.write(str(cube))
|
||||||
|
|
||||||
|
print(f"Куб минимального числа ({min_number}^3) = {cube} сохранен в {result_file}.")
|
||||||
|
|
||||||
|
except FileNotFoundError:
|
||||||
|
print(f"Файл {data_file} не найден.")
|
||||||
|
except ValueError:
|
||||||
|
print("Ошибка в данных файла. Убедитесь, что файл содержит только числа.")
|
||||||
|
|
||||||
|
|
||||||
|
if __name__ == "__main__":
|
||||||
|
calculate_cube(data_file, result_file)
|
16
minhasapov_ruslan_lab_2/docker-compose.yaml
Normal file
16
minhasapov_ruslan_lab_2/docker-compose.yaml
Normal file
@ -0,0 +1,16 @@
|
|||||||
|
services:
|
||||||
|
app_1: # Сервис с первой программой
|
||||||
|
build:
|
||||||
|
context: ./app_1/ # Указываем путь к директории программы и докер файла
|
||||||
|
volumes:
|
||||||
|
- ./data:/var/data # Монтируем локальную директорию с данными в /var/data
|
||||||
|
- ./result:/var/result # Монтируем локальную директорию с результирующими данными в /var/result
|
||||||
|
|
||||||
|
app_2: # Сервис со второй программой
|
||||||
|
depends_on:
|
||||||
|
- app_1 # Выполняем вторую программу после завершения первой
|
||||||
|
build:
|
||||||
|
context: ./app_2/
|
||||||
|
volumes:
|
||||||
|
- ./data:/var/data
|
||||||
|
- ./result:/var/result
|
Loading…
Reference in New Issue
Block a user