Как узнать системный диск python
4 Answers 4
On OS X, my drive has a name that shows up in Finder (Macintosh HD. I'm pretty sure this is the default name.) Any idea how I could find that name, because this is what shows up. sdiskpart(device='/dev/disk0s2', mountpoint='/', fstype='hfs', opts='rw,local,rootfs,dovolfs,journaled,multilabel') .
I don't know OS X well, but I'd suspect that would be the label for the disk. Maybe a call out to disklabel?
There isn't really a unified naming scheme for Linux devices that guarantees you a formatable block device. There are conventions, but they can vary widely and I can call my thumb-drive /Thomas/O if I want and there is no cross-platform way in Python to know:
- That /Thomas/O corresponds to /dev/sdf1
- That /dev/sdf1 can have a FAT32 filesystem made on it
- That /dev/sdf is not preferred to /dev/sdf1
I'm pretty sure that neither is there a cross-platform Python module which will allow you to determine that H:/ is formattable on a Windows system but that Z:/ is not.
Each system will require its own specific checks and validations which you could best learn from studying open-source disk manipulation software.
Is there a way in Python to list all the currently in-use drive letters in a Windows system?
(My Google-fu seems to have let me down on this one)
Показываем содержимое директории
Еще одна полезная команда — os.listdir(). Она показывает все содержимое каталога.
Команда отличается от os.walk (), где последний рекурсивно показывает все, что находится «под» каталогом. os.listdir () намного проще в использовании, потому что просто возвращает список содержимого:
В некоторых случаях нужно что-то более продвинутое — например, поиск всех CSV-файлов в каталоге «sample_data». В этом случае самый простой способ — использовать встроенную библиотеку glob:
17 Answers 17
Just to make sure you don't discard any non-empty strings, consider using drives = [drivestr in drives.split('\000') if drivestr]
This also returns virtual CD Drive as a result. Could be a good idea to check if path is valid or not I suppose.
Without using any external libraries, if that matters to you:
Any reason not to use string.lowercase or string.ascii_lowercase instead of string.letters[len(string.letters)/2:] ?
Berry: that will pop up nasty Windows dialogs if you have removable media drives without media in them.
This code is meaningless on Linux. GetLogicalDrives() is a Windows API. The concept of logical drives (C:, D:, etc.) doesn't exist on Linux. I don't know what Eclipse is doing.
Found this solution on Google, slightly modified from original. Seem pretty pythonic and does not need any "exotic" imports
I wrote this piece of code:
It's based on @Barmaley's answer, but has the advantage of not using the string module, in case you don't want to use it. It also works on my system, unlike @SingleNegationElimination's answer.
A Python noob here! Why "x in range(65,90)"? How does this work exactly? Some explanation would be useful for people like myself. Thank you in advance!
The ASCII codes 65 to 90 correspond to the letters A-Z. The script checks all possible drive designations (from A: to Z:) and if they exist, they are added to the list.
Those look like better answers. Here's my hackish cruft
Riffing a bit on RichieHindle's answer; it's not really better, but you can get windows to do the work of coming up with actual letters of the alphabet
mountvol / doesn't seem to do anything other than spit out usage info for the command on either Windows 7 or 10.
The Microsoft Script Repository includes this recipe which might help. I don't have a windows machine to test it, though, so I'm not sure if you want "Name", "System Name", "Volume Name", or maybe something else.
I've always felt that it is an excellent resource for Windows progarmmers that is not widely-enough known :-)
Thanks @Enkouyami, looks like Microsoft didn't kill the content, only moved it. I hunted around and found a working link.
Here is another great solution if you want to list only drives on your disc and not mapped network drives. If you want to filter by different attributes just print drps.
On Windows you can do a os.popen
More optimal solution based on @RichieHindle
here's a simpler version, without installing any additional modules or any functions. Since drive letters can't go beyond A and Z, you can search if there is path available for each alphabet, like below:
A Python noob here! I am guessing the '%s:' is something like a regular expression, but I am not sure. Some explanation regarding how this code really works, would be nice to improve my understanding. Thank you in advance!
Here's my higher-performance approach (could probably be higher):
Nobody really uses python's performative featurability.
Yes, I'm not following Windows standard path conventions ('\\').
In all my years of using python, I've had no problems with '/' anywhere paths are used, and have made it standard in my programs.
This code will return of list of drivenames and letters, for example:
['Gateway(C:)', 'EOS_DIGITAL(L:)', 'Music Archive(O:)']
It only uses the standard library. It builds on a few ideas I found above. windll.kernel32.GetVolumeInformationW() returns 0 if the disk drive is empty, a CD rom without a disk for example. This code does not list these empty drives.
These 2 lines capture the letters of all of the drives:
Here is the full routine:
This will help to find valid drives in windows os
The output will be
If you want only the letters for each drive, you can just:
As I don't have win32api installed on my field of notebooks I used this solution using wmic:
alternatively you can get the difference from both list like this simpler solution (after launching wmic subprocess as mounted_letters):
both solutions are similiarly fast, yet I guess set list is better for some reason, right?
As part of a similar task I also needed to grab a free drive letter. I decided I wanted the highest available letter. I first wrote it out more idiomatically, then crunched it to a 1-liner to see if it still made sense. As awesome as list comprehensions are I love sets for this: unused=set(alphabet)-set(used) instead of having to do unused = [a for a in aphabet if a not in used] . Cool stuff!
I also chose the alphabet using map/range/ord/chr over using string since parts of string are deprecated.
if you don't want to worry about cross platform issues, including those across python platforms such as Pypy, and want something decently performative to be used when drives are updated during runtime:
here's my performance test of this code:
Создание директории
Ну а теперь самое время создать директорию с именем test_dir внутри рабочей директории. Для этого можно использовать функцию
os.mkdir():
Давайте посмотрим, как это работает на практике.
Если же мы попытаемся создать каталог, который уже существует, то получим исключение.
Именно поэтому рекомендуется всегда проверять наличие каталога с определенным названием перед созданием нового:
Еще один совет по созданию каталогов. Иногда нам нужно создать подкаталоги с уровнем вложенности 2 или более. Если мы все еще используем os.mkdir (), нам нужно будет сделать это несколько раз. В этом случае мы можем использовать os.makedirs (). Эта функция создаст все промежуточные каталоги так же, как флаг mkdir -p в системе Linux:
Вот что получается в результате.
3.3 Запуск внешней программы путем создания процесса
Python_ Системное программирование Windows_ Углубленное понимание_Часть 1
Python - это мощный язык сценариев. Он может объединять программы, написанные на других языках, легко вызывать внешние программы и вызывать коды в библиотеках динамической компоновки, написанные на других языках, и даже упаковывать программы Python, поскольку исполняемая программа .exe может быть запущена. в системе Windows, в которой не установлен Python.
Перемещение файлов
Самое время попробовать переместить файлы из одной папки в другую. Рекомендованный способ — еще одна встроенная библиотека shutil.
Сейчас попробуем переместить все CSV-файлы из директории «sample_data» в директорию «test_dir». Ниже — пример кода для выполнения этой операции:
Кстати, есть два способа выполнить задуманное. Например, мы можем использовать библиотеку OS, если не хочется импортировать дополнительные библиотеки. Как os.rename, так и os.replace подходят для решения задачи.
Но обе они недостаточно «умные», чтобы позволить перемесить файлы в каталог.
Чтобы все это работало, нужно явно указать имя файла в месте назначения. Ниже — код, который это позволяет сделать:
Здесь функция os.path.basename () предназначена для извлечения имени файла из пути с любым количеством компонентов.
Другая функция, os.replace (), делает то же самое. Но разница в том, что os.replace () не зависит от платформы, тогда как os.rename () будет работать только в системе Unix / Linux.
Еще один минус — в том, что обе функции не поддерживают перемещение файлов из разных файловых систем, в отличие от shutil.
Поэтому я рекомендую использовать shutil.move () для перемещения файлов.
Удаление файлов и папок
Теперь пришел черед разобраться с процедурой удаления файлов и папок. Нам здесь снова поможет библиотека OS.
Когда нужно удалить файл, нужно воспользоваться командой os.remove():
Если требуется удалить каталог, на помощь приходит os.rmdir():
Однако он может удалить только пустой каталог. На приведенном выше скриншоте видим, что удалить можно лишь каталог level_3. Что если мы хотим рекурсивно удалить каталог level_1? В этом случае зовем на помощь shutil.
Функция shutil.rmtree() сделает все, что нужно:
Пользоваться ею нужно с осторожностью, поскольку она безвозвратно удаляет все содержимое каталога.
Собственно, на этом все. 8 важных операций по работе с файлами и каталогами в среде Python мы знаем. Что касается ссылки, о которой говорилось в анонсе, то вот она — это Google Colab Network с содержимым, готовым к запуску.
I am using Python2.6. I am trying to list the disk drives that a system may have.
On Windows, it may be something like C:/ , D:/ , E:/ , etc. On Linux, it may be something like /boot , /media/SDCard , etc. And I don't know what it's like on a Mac. Maybe something under /Volumes.
Does anyone know of a cross platform way (that is, one which works on Linux, Windows and Mac) in Python?
I am building an interface for users to select disk drives attached to the computer. It will need to know the space available on the drives, and have the ability to format them with FAT32 filesystems (maybe) and be able to access files.
suggestion: stub out the selection to work with what you have access to, get that to work, and then make the comparatively easy device selection. And do be careful with formating, in case that doesn't go without saying.
3.2 Используйте модуль win32api для запуска внешней программы с помощью функции ShellExecute ()
При запуске программы или открытии файла таким образом он не откроет сначала cmd, как метод system () модуля os, и система автоматически свяжет соответствующую программу и откроет файл в соответствии с типом файла, аналогично двойным щелчком, чтобы открыть файл.
Объединение компонентов пути
В предыдущем примере я намеренно использовал слеш "/" для разделителя компонентов пути. В принципе это нормально, но не рекомендуется. Если вы хотите, чтобы ваше приложение было кроссплатформенным, такой вариант не подходит. Так, некоторые старые версии ОС Windows распознают только слеш "\" в качестве разделителя.
Но не переживайте, Python прекрасно решает эту проблему благодаря функции os.path.join (). Давайте перепишем вариант из примера в предыдущем пункте, используя эту функцию:
Проверяем, существует файл или каталог
Прежде чем задействовать команду по созданию файла или каталога, стоит убедиться, что аналогичных элементов нет. Это поможет избежать ряда ошибок при работе приложения, включая перезапись существующих элементов с данными.
Функция os.path.exists () принимает аргумент строкового типа, который может быть либо именем каталога, либо файлом.
В случае с Google Colab при каждом запуске создается папка sample_data. Давайте проверим, существует ли такой каталог. Для этого подойдет следующий код:
Эта же команда подходит и для работы с файлами:
Если папки или файла нет, команда возвращает false.
Копирование файлов
Аналогичным образом shutil подходит и для копирования файлов по уже упомянутым причинам.
Если нужно скопировать файл README.md из папки «sample_data» в папку «test_dir», поможет функция shutil.copy():
2. Создайте исполняемый файл.
После преобразования программы Python в исполняемый файл версии .exe можно гарантировать ее запуск на платформе Windows, на которой среда Python не установлена. Чтобы преобразовать программу Python в исполняемый файл .exe, вам необходимо использоватьмодули py2exe и distutils
py2exe имеет определенные ограничения и может использоваться выше версии python2 или ниже версии python3.4
Например, сохраните приведенный выше код для определения списка программ, запускаемых при запуске системы, как файл CheckAndViewAutoRunsInSystem.py, а затем напишите файл setup.py с содержимым:
Наконец, выполните следующую команду в командной строке
Если создание прошло успешно, в текущей папке будет создана подпапка dist, которая будет содержать все содержимое, необходимое для окончательного выполнения программы.
Еще один лучший инструмент для упаковки программ Python - это pyinstaller, который можно передать
Установить инструмент.
После завершения установки используйте команду непосредственно в оболочке
Программа Python в текущем каталоге и зависимые от нее пакеты могут быть упакованы как python filename.exe.
Если установка не удалась, вы можете сначала попробовать запустить эту оболочку.
Показать текущий каталог
Самая простая и вместе с тем одна из самых важных команд для Python-разработчика. Она нужна потому, что чаще всего разработчики имеют дело с относительными путями. Но в некоторых случаях важно знать, где мы находимся.
Относительный путь хорош тем, что работает для всех пользователей, с любыми системами, количеством дисков и так далее.
Так вот, для того чтобы показать текущий каталог, нужна встроенная в Python OS-библиотека:
Ее легко запомнить, так что лучше выучить один раз, чем постоянно гуглить. Это здорово экономит время.
Имейте в виду, что я использую Google Colab, так что путь /content является абсолютным.
3. Вызов внешней программы.
1. Программирование реестра
Для операционной системы Windows реестр является очень важной частью. Windows хранит в реестре почти всю информацию о поддержке программного и аппаратного обеспечения. Читая данные в реестре, вы можете получить соответствующую информацию о платформе Windows, такую как список установленных служб и программ, список программ, которые запускаются автоматически после запуска, взаимосвязь между типами файлов и программами и т. Д. ; изменяя данные в реестре, можно продолжить детальную настройку системы Windows.
В реестре Windows есть следующие 5 корневых ключей.
- HKEY_LOCAL_MACHINE(HKLM)
- HKEY_CURRENT_CONFIG(HKCC)
- HKEY_CLASSES_ROOT(HKCR)
- HKEY_USERS(HKU)
- HKEY_CURRENT_USER(HKCU)
Введите regedit в оболочке Windows, чтобы открыть редактор реестра:
В интерфейсе редактора реестра вы можете добавлять, удалять, изменять и проверять ключи и значения реестра.
В реестре значение может быть числом, строкой и другими типами. Ниже приведены подробные типы:
Для программирования реестра вы можете использовать модуль win32api и модуль win32con.Модуль win32api инкапсулирует функции Windows API и предоставляет очень удобный интерфейс. В этом модуле обычно используются 8 функций работы с реестром.
- RegOpenKey()/RegOpenKeyEx() : Открыть реестр
- RegCloseKey() : Закрыть реестр
- RegQueryValue()/RegQueryValueEx() : Прочитать значение элемента
- RegCreateKey()/RegCreateKeyEx() : Добавить элемент
- RegDeleteKey() : Удалить пункт
- RegEnumKey() : Перечислить подключи
- RegDeletetValue() : Удалить значение
Например, запросите реестр и выведите информацию о версии программного обеспечения браузера IE, установленного на компьютере:
(Программа должна запускаться с правами администратора) Результаты:
Проверьте список программ, которые запускаются при старте системы
результат:
Другой распространенный способ управления реестром Windows - использование Python-модуля winreg, который предоставляет OpenKey() , DeleteKey() , DeleteValue() , CreateKey() , SetValue() , QueryValueEx() , EnumValue() с EnumKey() Большое количество методов доступа и работы с реестром.
Есть блог, в котором очень хорошо это резюмируется,Подробности
- Следующий код демонстрирует использование модуля winreg для перечисления значений реестра:
результат:
3.4 Вызов кода библиотеки динамической компоновки через ctypes
- ctypesЭто стандартный модуль расширения для Python для работы с библиотеками динамической компоновки. Он предоставляет типы данных, совместимые с языком C, и позволяет вызывать код в библиотеке динамической компоновки или общей библиотеке в программе Python, таким образом поддерживая смешанное программирование Python. и другие языки программирования, чтобы в полной мере раскрыть свои преимущества. Их преимущества значительно повышают эффективность разработки и допустимую эффективность.
- Кроме того,NumPyМодуль также предоставляет функцию numpy.ctypeslib.load_library() Он используется для открытия указанной библиотеки динамической компоновки и возврата объекта ctypes, через который можно получить доступ к функциям в библиотеке динамической компоновки.
- Или используйтеSciPyМодуль Weave библиотеки также может легко встраивать программы на C ++ в программы Python в виде строк.
ctypes предоставляет 3 метода для вызова библиотеки динамической компоновки:
- cdll: функция, экспортируемая библиотекой, загруженной cdll, должна использовать стандартное соглашение о вызовах cdecl (параметры функции помещаются в стек справа налево. После выполнения функции вызывающая функция отвечает за стек. баланс кадра функции)
- windll: функции, экспортируемые библиотекой, загруженной windll, должны использовать соглашение о вызовах stdcall (собственное соглашение Win32 API)
- oledll: метод oledll похож на windll, но предположим, что функция возвращает код ошибки HRESULT
Следующий код вызывает функцию MessageBoxA () в библиотеке динамической компоновки Windows user32.dll для отображения диалогового окна:
Или используйте более сжатую форму ниже:
Следующий код вызывает функцию printf () в стандартной библиотеке функций C msvcrt для вывода текста:
Или воспользуйтесь следующей формой:
Приведенная выше программа выводит количество символов в jupternotebook вместо символов. Если вы сохраните приведенный выше код в виде файла .py, вы можете вывести строку, запустив ее с помощью команды python.
ctypesПредоставляет типы данных, совместимые с языком C, но при использовании структуры языка C в Python ее необходимо переписывать по классам. В следующей таблице показаны соответствующие отношения основных типов:
ctypes тип | Тип C | Тип Python |
---|---|---|
c_bool | _Bool | bool (1) |
c_char | char | Односимвольный байтовый объект |
c_wchar | wchar_t | Строка из одного символа |
c_byte | char | Целое число |
c_ubyte | unsigned char | Целое число |
c_short | short | Целое число |
c_ushort | unsigned short | Целое число |
c_int | int | Целое число |
c_uint | unsigned int | Целое число |
c_long | long | Целое число |
c_ulong | unsigned long | Целое число |
c_longlong | __int64 Или же long long | Целое число |
c_ulonglong | unsigned __int64 Или же unsigned long long | Целое число |
c_size_t | size_t | Целое число |
c_ssize_t | ssize_t Или же Py_ssize_t | Целое число |
c_float | float | Плавающая точка |
c_double | double | Плавающая точка |
c_longdouble | long double | Плавающая точка |
c_char_p | char * (NUL terminated) | Объект Bytestring или None |
c_wchar_p | wchar_t * (NUL terminated) | Строка или None |
c_void_p | void * | int или None |
Перечислить список процессов
результат:
Расскажу я вам сегодня о том, как пытался я добраться из питона до интерфейса жесткого диска, и что из этого получилось.
Появляется у меня периодически необходимость тестирования большого количества жестких дисков. Обычно для этого используется досовая Victoria загружающаяся по сети. Она тестирует диски по одному, что не очень удобно. К тому же последнее время пошли платы не имеющие режима IDE, что дополнительно усложняет задачу. По началу у меня возникла идея взять готовый софт под линукс с открытыми исходниками и добавить ему возможность параллельного тестирования нескольких дисков. После беглого поиска выяснилось удручающее состояние этой области в линуксе. Из софта, ведущего при тестировании статистику по времени доступа к секторам и типам ошибок нашел только whdd. Попытка разобраться с кодом whdd закончилась полным провалом. Для меня, ни разу не программиста, код показался очень запутанным. К тому же большую его часть занимает совсем не работа с железом.
Поняв, что простого решения не предвидится я решил попробовать написать подобную программу самостоятельно. Понимая, что подобный проект на C я не осилю я начал изучать возможность прямой работы с дисками из python, которым я частенько пользуюсь для решения простых задач и люблю за простоту и понятность. Информации по этому вопросу в сети кот наплакал, но все же я выяснил, что существует модуль fcntl который в том числе позволяет отправлять устройству ioctl запросы. Теперь у меня появилась возможность отправлять команды диску. Но в линуксе все диски считаются scsi дисками, а для тестирования нужно передавать диску непосредственно ata команды. Оказалось существует механизм ATA Command Pass-Through, позволяющий обернуть ata команду в scsi запрос. Основную информацию о том, как это использовать удалось почерпнуть из исходных текстов проекта sg3_utils. Осталось попробовать реализовать это все на питоне.
Для того, чтобы создать в питоне структуры аналогичные структурам языка C, для последующей передачи их в ioctl, существует модуль ctypes. Отдельно стоит упомянуть количество седых волос появившихся в результате отладки странных глюков с этими структурами. Так я открыл для себя знание о выравнивании структур в C. В результате родились две структуры:
Структура для ATA Pass-Through:
И структура для ioctl:
Поскольку заполнение этих структур требуется перед каждой дисковой операцией и занимает много места, эта операция вынесена в отдельную функцию. В многобайтовых значениях нужно поменять порядок байтов.
Эта функция принимает ata команду, параметры и буферы а возвращает готовую структуру для ioctl запроса. Дальше все просто. Создаем буфер в котором вернутся статус выполнения команды и содержимое ata регистров статуса и ошибки. Создаем буфер для сектора, прочитанного с диска. Заполняем структуры и выполняем нашу первую ata команду.
В ответ получаем сектор с информацией о диске:
В нем содержится полная информация о диске, извлечем основную.
В результате получаем:
модель: Hitachi HUA722020ALA330; прошивка: JKAOA3; серийный номер: JK11A1YAJE2N5V; число секторов: 3907029168.
Теперь мы умеем отправлять ata команды диску и получать от него ответы. Потихоньку результат моей работы оформился в библиотечку, содержащую реализацию основного набора ata команд, включая чтение SMART. Кому интересно можно взглянуть на нее здесь. Качество кода сильно не ругайте, я не волшебник программист я только учусь.
Теперь осталось с ее помощью написать утилиту тестирования. Чувствую меня ждет еще много открытий.
Upd:
По рекомендации amarao я переписал библиотеку используя классы и исключения. Также я решил, что название sgio вводит в заблуждение относительно назначения библиотеки. Библиотека теперь называется atapt и доступна на GitHub и через pip. На гитхабе есть пример использования.
Python становится все популярнее благодаря относительной простоте изучения, универсальности и другим преимуществам. Правда, у начинающих разработчиков нередко возникают проблемы при работе с файлами и файловой системой. Просто потому, что они знают не все команды, которые нужно знать.
Эта статья предназначена как раз для начинающих разработчиков. В ней описаны 8 крайне важных команд для работы с файлами, папками и файловой системой в целом. Все примеры из этой статьи размещены в Google Colab Notebook (ссылка на ресурс — в конце статьи).
3.1 Используйте метод модуля os для вызова внешней программы
Используя указанный выше системный метод, вы также можете вызывать системные команды Windows, такие как dir, xcopy и т. Д., Но есть недостаток. Независимо от того, какая программа запущена, сначала будет запущено окно консоли, а затем вызываемая программа будет быть открытыми.
Вы также можете использовать метод popen () модуля os, чтобы открыть внешнюю программу, чтобы окно командной строки не отображалось.
Или вы можете использовать метод startfile () модуля os, чтобы открыть внешнюю программу или файл, и система автоматически свяжет соответствующую программу для открытия или выполнения файла.
Not the answer you're looking for? Browse other questions tagged python windows or ask your own question.
Linked
Related
Hot Network Questions
To subscribe to this RSS feed, copy and paste this URL into your RSS reader.
Site design / logo © 2022 Stack Exchange Inc; user contributions licensed under cc by-sa. rev 2022.5.6.42057
Читайте также: