Перейти к содержимому

Python src что это

  • автор:

Модуль shutil

Python 3 логотип

Модуль shutil содержит набор функций высокого уровня для обработки файлов, групп файлов, и папок. В частности, доступные здесь функции позволяют копировать, перемещать и удалять файлы и папки. Часто используется вместе с модулем os.

Операции над файлами и директориями

shutil.copyfileobj(fsrc, fdst[, length]) — скопировать содержимое одного файлового объекта (fsrc) в другой (fdst). Необязательный параметр length — размер буфера при копировании (чтобы весь, возможно огромный, файл не читался целиком в память).

При этом, если позиция указателя в fsrc не 0 (т.е. до этого было сделано что-то наподобие fsrc.read(47)), то будет копироваться содержимое начиная с текущей позиции, а не с начала файла.

shutil.copyfile(src, dst, follow_symlinks=True) — копирует содержимое (но не метаданные) файла src в файл dst. Возвращает dst (т.е. куда файл был скопирован). src и dst это строки — пути к файлам. dst должен быть полным именем файла.

Если src и dst представляют собой один и тот же файл, исключение shutil.SameFileError.

Если dst существует, то он будет перезаписан.

Если follow_symlinks=False и src является ссылкой на файл, то будет создана новая символическая ссылка вместо копирования файла, на который эта символическая ссылка указывает.

shutil.copymode(src, dst, follow_symlinks=True) — копирует права доступа из src в dst. Содержимое файла, владелец, и группа не меняются.

shutil.copystat(src, dst, follow_symlinks=True) — копирует права доступа, время последнего доступа, последнего изменения, и флаги src в dst. Содержимое файла, владелец, и группа не меняются.

shutil.copy(src, dst, follow_symlinks=True) — копирует содержимое файла src в файл или папку dst. Если dst является директорией, файл будет скопирован с тем же названием, что было в src. Функция возвращает путь к местонахождению нового скопированного файла.

Если follow_symlinks=False, и src это ссылка, dst будет ссылкой.

Если follow_symlinks=True, и src это ссылка, dst будет копией файла, на который ссылается src

copy() копирует содержимое файла, и права доступа.

shutil.copy2(src, dst, follow_symlinks=True) — как copy(), но пытается копировать все метаданные.

shutil.copytree(src, dst, symlinks=False, ignore=None, copy_function=copy2, ignore_dangling_symlinks=False) — рекурсивно копирует всё дерево директорий с корнем в src, возвращает директорию назначения.

Директория dst не должна существовать. Она будет создана, вместе с пропущенными родительскими директориями.

Права и времена у директорий копируются copystat(), файлы копируются с помощью функции copy_function (по умолчанию shutil.copy2()).

Если symlinks=True, ссылки в дереве src будут ссылками в dst, и метаданные будут скопированы настолько, насколько это возможно.

Если False (по умолчанию), будут скопированы содержимое и метаданные файлов, на которые указывали ссылки.

Если symlinks=False, если файл, на который указывает ссылка, не существует, будет добавлено исключение в список ошибок, в исключении shutil.Error в конце копирования.

Можно установить флаг ignore_dangling_symlinks=True, чтобы скрыть данную ошибку.

Если ignore не None, то это должна быть функция, принимающая в качестве аргументов имя директории, в которой сейчас copytree(), и список содержимого, возвращаемый os.listdir(). Т.к. copytree() вызывается рекурсивно, ignore вызывается 1 раз для каждой поддиректории. Она должна возвращать список объектов относительно текущего имени директории (т.е. подмножество элементов во втором аргументе). Эти объекты не будут скопированы.

shutil.ignore_patterns(*patterns) — функция, которая создаёт функцию, которая может быть использована в качестве ignore для copytree(), игнорируя файлы и директории, которые соответствуют glob-style шаблонам.

shutil.rmtree(path, ignore_errors=False, onerror=None) — Удаляет текущую директорию и все поддиректории; path должен указывать на директорию, а не на символическую ссылку.

Если ignore_errors=True, то ошибки, возникающие в результате неудавшегося удаления, будут проигнорированы. Если False (по умолчанию), эти ошибки будут передаваться обработчику onerror, или, если его нет, то исключение.

На ОС, которые поддерживают функции на основе файловых дескрипторов, по умолчанию используется версия rmtree(), не уязвимая к атакам на символические ссылки.

На других платформах это не так: при подобранном времени и обстоятельствах «хакер» может, манипулируя ссылками, удалить файлы, которые недоступны ему в других обстоятельствах.

Чтобы проверить, уязвима ли система к подобным атакам, можно использовать атрибут rmtree.avoids_symlink_attacks.

Если задан onerror, это должна быть функция с 3 параметрами: function, path, excinfo.

Первый параметр, function, это функция, которая создала исключение; она зависит от платформы и интерпретатора. Второй параметр, path, это путь, передаваемый функции. Третий параметр, excinfo — это информация об исключении, возвращаемая sys.exc_info(). Исключения, вызванные onerror, не обрабатываются.

shutil.move(src, dst, copy_function=copy2) — рекурсивно перемещает файл или директорию (src) в другое место (dst), и возвращает место назначения.

Если dst — существующая директория, то src перемещается внутрь директории. Если dst существует, но не директория, то оно может быть перезаписано.

shutil.disk_usage(path) — возвращает статистику использования дискового пространства как namedtuple с атрибутами total, used и free, в байтах.

shutil.chown(path, user=None, group=None) — меняет владельца и/или группу у файла или директории.

shutil.which(cmd, mode=os.F_OK | os.X_OK, path=None) — возвращает путь к исполняемому файлу по заданной команде. Если нет соответствия ни с одним файлом, то None. mode это права доступа, требующиеся от файла, по умолчанию ищет только исполняемые.

Архивация

Высокоуровневые функции для созданиия и чтения архивированных и сжатых файлов. Основаны на функциях из модулей zipfile и tarfile.

shutil.make_archive(base_name, format[, root_dir[, base_dir[, verbose[, dry_run[, owner[, group[, logger]]]]]]]) — создаёт архив и возвращает его имя.

base_name это имя файла для создания, включая путь, но не включая расширения (не нужно писать «.zip» и т.д.).

format — формат архива.

root_dir — директория (относительно текущей), которую мы архивируем.

base_dir — директория, в которую будет архивироваться (т.е. все файлы в архиве будут в данной папке).

Если dry_run=True, архив не будет создан, но операции, которые должны были быть выполнены, запишутся в logger.

owner и group используются при создании tar-архива.

shutil.get_archive_formats() — список доступных форматов для архивирования.

shutil.unpack_archive(filename[, extract_dir[, format]]) — распаковывает архив. filename — полный путь к архиву.

extract_dir — то, куда будет извлекаться содержимое (по умолчанию в текущую).

format — формат архива (по умолчанию пытается угадать по расширению файла).

shutil.get_unpack_formats() — список доступных форматов для разархивирования.

Запрос размера терминала вывода

shutil.get_terminal_size(fallback=(columns, lines)) — возвращает размер окна терминала.

fallback вернётся, если не удалось узнать размер терминала (терминал не поддерживает такие запросы, или программа работает без терминала). По умолчанию (80, 24).

Для вставки кода на Python в комментарий заключайте его в теги

  • Модуль csv - чтение и запись CSV файлов
  • Создаём сайт на Django, используя хорошие практики. Часть 1: создаём проект
  • Онлайн-обучение Python: сравнение популярных программ
  • Книги о Python
  • GUI (графический интерфейс пользователя)
  • Курсы Python
  • Модули
  • Новости мира Python
  • NumPy
  • Обработка данных
  • Основы программирования
  • Примеры программ
  • Типы данных в Python
  • Видео
  • Python для Web
  • Работа для Python-программистов
  • Сделай свой вклад в развитие сайта!
  • Самоучитель Python
  • Карта сайта
  • Отзывы на книги по Python
  • Реклама на сайте

Что это за модуль src_rc?

После создания виджета в Qt Designer и переноса в Python с помощью pyuic5 в самом конце кода образовался непонятный импорт: import src_rc .
Вопрос: откуда он взялся и зачем он нужен. Если попробовать его установить pip его не находит.
Вот код:

from PyQt5 import QtCore, QtGui, QtWidgets class Ui_MainWindow(object): def setupUi(self, MainWindow): MainWindow.setObjectName("MainWindow") MainWindow.resize(1246, 698) sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Fixed, QtWidgets.QSizePolicy.Fixed) sizePolicy.setHorizontalStretch(0) sizePolicy.setVerticalStretch(0) sizePolicy.setHeightForWidth(MainWindow.sizePolicy().hasHeightForWidth()) MainWindow.setSizePolicy(sizePolicy) MainWindow.setMinimumSize(QtCore.QSize(1246, 698)) MainWindow.setMaximumSize(QtCore.QSize(1246, 698)) MainWindow.setStyleSheet("background: #191919;") self.centralwidget = QtWidgets.QWidget(MainWindow) self.centralwidget.setObjectName("centralwidget") self.nav_menu = QtWidgets.QGroupBox(self.centralwidget) self.nav_menu.setEnabled(True) self.nav_menu.setGeometry(QtCore.QRect(0, 0, 269, 698)) sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Fixed, QtWidgets.QSizePolicy.Preferred) sizePolicy.setHorizontalStretch(0) sizePolicy.setVerticalStretch(0) sizePolicy.setHeightForWidth(self.nav_menu.sizePolicy().hasHeightForWidth()) self.nav_menu.setSizePolicy(sizePolicy) self.nav_menu.setMinimumSize(QtCore.QSize(269, 0)) self.nav_menu.setMaximumSize(QtCore.QSize(16777215, 16777215)) self.nav_menu.setStyleSheet("border: 0;\n" "background: #151515;") self.nav_menu.setObjectName("nav_menu") self.btn_add_folder = QtWidgets.QLabel(self.nav_menu) self.btn_add_folder.setGeometry(QtCore.QRect(218, 30, 24, 31)) sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Fixed, QtWidgets.QSizePolicy.Fixed) sizePolicy.setHorizontalStretch(0) sizePolicy.setVerticalStretch(0) sizePolicy.setHeightForWidth(self.btn_add_folder.sizePolicy().hasHeightForWidth()) self.btn_add_folder.setSizePolicy(sizePolicy) self.btn_add_folder.setMinimumSize(QtCore.QSize(24, 31)) self.btn_add_folder.setMaximumSize(QtCore.QSize(24, 31)) self.btn_add_folder.setText("") self.btn_add_folder.setPixmap(QtGui.QPixmap("F:/Projects/Python/.pyqt/Tasker/src/img/add_folder.svg")) self.btn_add_folder.setObjectName("btn_add_folder") self.logo = QtWidgets.QLabel(self.nav_menu) self.logo.setGeometry(QtCore.QRect(20, 20, 142, 52)) sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Preferred, QtWidgets.QSizePolicy.Preferred) sizePolicy.setHorizontalStretch(0) sizePolicy.setVerticalStretch(0) sizePolicy.setHeightForWidth(self.logo.sizePolicy().hasHeightForWidth()) self.logo.setSizePolicy(sizePolicy) self.logo.setMaximumSize(QtCore.QSize(142, 52)) self.logo.setText("") self.logo.setPixmap(QtGui.QPixmap(":/src/img/logo.svg")) self.logo.setObjectName("logo") self.buttons = QtWidgets.QGroupBox(self.nav_menu) self.buttons.setGeometry(QtCore.QRect(23, 93, 219, 583)) sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Fixed, QtWidgets.QSizePolicy.Fixed) sizePolicy.setHorizontalStretch(0) sizePolicy.setVerticalStretch(0) sizePolicy.setHeightForWidth(self.buttons.sizePolicy().hasHeightForWidth()) self.buttons.setSizePolicy(sizePolicy) self.buttons.setMaximumSize(QtCore.QSize(219, 583)) self.buttons.setTitle("") self.buttons.setObjectName("buttons") self.btn_menu1 = QtWidgets.QPushButton(self.buttons) self.btn_menu1.setGeometry(QtCore.QRect(0, 0, 219, 37)) sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Maximum, QtWidgets.QSizePolicy.Fixed) sizePolicy.setHorizontalStretch(0) sizePolicy.setVerticalStretch(0) sizePolicy.setHeightForWidth(self.btn_menu1.sizePolicy().hasHeightForWidth()) self.btn_menu1.setSizePolicy(sizePolicy) self.btn_menu1.setMaximumSize(QtCore.QSize(219, 37)) font = QtGui.QFont() font.setFamily("Inter") font.setPointSize(-1) font.setBold(False) font.setItalic(False) font.setWeight(50) self.btn_menu1.setFont(font) self.btn_menu1.setStyleSheet("background: #1490AA;\n" "border-radius: 11px;\n" "font-family: \'Inter\';\n" "font-style: normal;\n" "font-weight: 400;\n" "font-size: 16px;\n" "line-height: 19px;\n" "text-align: left;\n" "color: #FFFFFF;\n" "padding: 8px 0 8px 15px;") self.btn_menu1.setObjectName("btn_menu1") self.btn_menu2 = QtWidgets.QPushButton(self.buttons) self.btn_menu2.setGeometry(QtCore.QRect(0, 47, 219, 37)) sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Maximum, QtWidgets.QSizePolicy.Fixed) sizePolicy.setHorizontalStretch(0) sizePolicy.setVerticalStretch(0) sizePolicy.setHeightForWidth(self.btn_menu2.sizePolicy().hasHeightForWidth()) self.btn_menu2.setSizePolicy(sizePolicy) self.btn_menu2.setMaximumSize(QtCore.QSize(219, 37)) self.btn_menu2.setStyleSheet("background: #282828;\n" "border-radius: 11px;\n" "font-family: \'Inter\';\n" "font-style: normal;\n" "font-weight: 400;\n" "font-size: 16px;\n" "line-height: 19px;\n" "text-align: left;\n" "color: #FFFFFF;\n" "padding: 8px 0 8px 15px;") self.btn_menu2.setObjectName("btn_menu2") self.btn_menu3 = QtWidgets.QPushButton(self.buttons) self.btn_menu3.setGeometry(QtCore.QRect(0, 94, 219, 37)) sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Maximum, QtWidgets.QSizePolicy.Fixed) sizePolicy.setHorizontalStretch(0) sizePolicy.setVerticalStretch(0) sizePolicy.setHeightForWidth(self.btn_menu3.sizePolicy().hasHeightForWidth()) self.btn_menu3.setSizePolicy(sizePolicy) self.btn_menu3.setMaximumSize(QtCore.QSize(219, 37)) self.btn_menu3.setStyleSheet("background: #282828;\n" "border-radius: 11px;\n" "font-family: \'Inter\';\n" "font-style: normal;\n" "font-weight: 400;\n" "font-size: 16px;\n" "line-height: 19px;\n" "text-align: left;\n" "color: #FFFFFF;\n" "padding: 8px 0 8px 15px;") self.btn_menu3.setObjectName("btn_menu3") self.stackedWidget = QtWidgets.QStackedWidget(self.centralwidget) self.stackedWidget.setGeometry(QtCore.QRect(269, -20, 977, 719)) sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Fixed, QtWidgets.QSizePolicy.Fixed) sizePolicy.setHorizontalStretch(0) sizePolicy.setVerticalStretch(0) sizePolicy.setHeightForWidth(self.stackedWidget.sizePolicy().hasHeightForWidth()) self.stackedWidget.setSizePolicy(sizePolicy) self.stackedWidget.setMinimumSize(QtCore.QSize(977, 719)) self.stackedWidget.setMaximumSize(QtCore.QSize(977, 719)) self.stackedWidget.setObjectName("stackedWidget") self.page_3 = QtWidgets.QWidget() self.page_3.setObjectName("page_3") self.stackedWidget.addWidget(self.page_3) self.page_4 = QtWidgets.QWidget() self.page_4.setObjectName("page_4") self.stackedWidget.addWidget(self.page_4) MainWindow.setCentralWidget(self.centralwidget) self.retranslateUi(MainWindow) self.stackedWidget.setCurrentIndex(0) QtCore.QMetaObject.connectSlotsByName(MainWindow) def retranslateUi(self, MainWindow): _translate = QtCore.QCoreApplication.translate MainWindow.setWindowTitle(_translate("MainWindow", "MainWindow")) self.btn_menu1.setText(_translate("MainWindow", "Все задачи")) self.btn_menu2.setText(_translate("MainWindow", "Папка 1")) self.btn_menu3.setText(_translate("MainWindow", "Папка 2")) import src_rc 

src layout vs flat layout#

The “flat layout” refers to organising a project’s files in a folder or repository, such that the various configuration files and import packages are all in the top-level directory.

. ├── README.md ├── noxfile.py ├── pyproject.toml ├── setup.py ├── awesome_package/ │ ├── __init__.py │ └── module.py └── tools/ ├── generate_awesomeness.py └── decrease_world_suck.py

The “src layout” deviates from the flat layout by moving the code that is intended to be importable (i.e. import awesome_package , also known as import packages ) into a subdirectory. This subdirectory is typically named src/ , hence “src layout”.

. ├── README.md ├── noxfile.py ├── pyproject.toml ├── setup.py ├── src/ │ └── awesome_package/ │ ├── __init__.py │ └── module.py └── tools/ ├── generate_awesomeness.py └── decrease_world_suck.py
  • The src layout requires installation of the project to be able to run its code, and the flat layout does not. This means that the src layout involves an additional step in the development workflow of a project (typically, an editable installation is used for development and a regular installation is used for testing).
  • The src layout helps prevent accidental usage of the in-development copy of the code. This is relevant since the Python interpreter includes the current working directory as the first item on the import path. This means that if an import package exists in the current working directory with the same name as an installed import package, the variant from the current working directory will be used. This can lead to subtle misconfiguration of the project’s packaging tooling, which could result in files not being included in a distribution. The src layout helps avoid this by keeping import packages in a directory separate from the root directory of the project, ensuring that the installed copy is used.
  • The src layout helps enforce that an editable installation is only able to import files that were meant to be importable. This is especially relevant when the editable installation is implemented using a path configuration file that adds the directory to the import path. The flat layout would add the other project files (eg: README.md , tox.ini ) and packaging/tooling configuration files (eg: setup.py , noxfile.py ) on the import path. This would make certain imports work in editable installations but not regular installations.

Is setup.py deprecated?

Python src что это

Рисунок 17.352. Пример применения фильтра « Разрез »

Пример применения фильтра Разрез

Исходное изображение с направляющими

Пример применения фильтра Разрез

После применения фильтра « Нарезка »

Этот фильтр хорош для создания изображений для интернета, чуствительных к нажатию мышки. Он разрезает изображение (так же, как и команда Гильотина) по вертикальным и горизонтальным направляющим и производит набор подизображений. В то же время он создаёт часть кода HTML для таблицы, сохраняемой в тектстовом файле. Каждая ячейка таблицы содержить одну часть изображения. Текстовый файл затем может быть вставлен в файл HTML.

Этот фильтр просто помощник. Типичный код HTML, который он создаёт, выглядит примерно так:

Пример 17.1. Примерный вывод фильтра « Разрез »

 

Производимый код HTML; атрибуты « стиля » были опущены.

Когда в изображении нет направляющих, фильтр ничего не делает. Если направляющие просто не видимы, фильтр будет работать.

Фильтр Карта изображения более сильный и разнообразный инструмент для создания чуствительных изображений, но он также более сложный.

14.4.2. Активация фильтра

This filter is found in the image window menu under Filters → Web → Slice… .

14.4.3. Параметры

Рисунок 17.353. Параметры фильтра « Разрез »

Параметры фильтра Разрез

Параметры в основном не требуют комментария, но всё же:

Путь для экпорта HTML

Указывает, где файл HTML и файлы подизображений будут сохранены. По умолчанию, эти файлы будут сохранены в рабочей папке. Нажатием на кнопку справа можно вызвать меню, где можно указать новый путь.

Имя файла для экпорта

Имя файла HTML. Поле ввода позволяет сменить имя файла.

Приставка и имени файла

Имя файла, созданного этим фильтром подчиняется формуле приставка_i_k.ext , где приставка это часть имени, которую можно указать в поле ввода справа. Значение по умолчанию – slice . ( i и k это номера ряда и столбца; они начинаются с нуля; .ext – расширение файла, которое зависит от указанного Формата изображения .)

This option is particularly useful when you want to create JavaScript for onmouseover and clicked and need different sets of images.

Отдельная папка для изображения, Папка для экспорта изображения

При выборе параметра Отдельная папка изображения будет создана новая папка, куда поместятся файлы изображения. По умолчанию, имя папки – images , но его можно сменить в поле ввода Папка для экспорта изображения .

Пример 17.2. С отдельной папкой для изображения

Пример с выбранным параметром « Отдельная папка для изображения »

Промежуток между ячейками таблицы

Это значение (0-15) будет присвоено атрибуту HTML таблицы « cellspacing » . В результате вертикальные и горизонтальные направляющие заменятся на полосы указаной ширины:

Пример 17.3. Промежуток между ячейками таблицы

Отрывок соответствующего кода HTML

Заметьте, что изображение не увеличится на размер этих полос. Вместо этого изображение будет выглядеть, как будто полосы были просто удалены из изображения с помощью инструмента « ластик » .

JavaScript for onmouseover and clicked

При выборе этого параметра, фильтр также добавит некоторый код JavaScript. Как и код HTML, этот код не работает, но служит начальной точкой для добавления динамической функциональности. Код JavaScript даёт функцию для обработки таких событий, как « onmouseover » :

Пример 17.4. Отрывок соответствующего кода JavaScript

function exchange (image, images_array_name, event) < name = image.name; images = eval (images_array_name); switch (event) < case 0: image.src = images[name + "_plain"].src; break; case 1: image.src = images[name + "_hover"].src; break; case 2: image.src = images[name + "_clicked"].src; break; case 3: image.src = images[name + "_hover"].src; break; >>

Пропустить анимацию для заголовка таблицы

Если этот параметр не выбран, фильтр добавит макет ссылки . к каждой ячейке таблицы. При выборе (по умолчанию) и если есть по крайней мере две горизонтальные и две вертикальные направляющие, фильтр не добавит макет ссылок к первой и последней ячейке ряда или столбца. Это полезно, когда у изображения есть край, и не желательно, чтобы этот край был чуствительным.

Пример 17.5. Пропустить анимацию для заголовка таблицы (упрощённый код HTMl)

 

Только внутренние ячейки содержат ссылки (пустые).

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *