Python не видит файл
Обновлено: 21.11.2024
Открытие файлов и чтение их данных — это то, что мы научились делать с помощью простого двойного щелчка при самом раннем взаимодействии с компьютером. Однако на программном уровне все существенно сложнее…
Вот официальная документация Python по чтению и записи файлов. Но прежде чем читать это, давайте углубимся в тот минимум, который я хочу, чтобы вы знали.
Давайте сразу перейдем к примеру кода. Представьте, что у вас есть файл с именем example.txt в текущем каталоге. Если нет, просто создайте его, а затем заполните его этими строками и сохраните:
Вот короткий фрагмент кода Python, чтобы открыть этот файл и распечатать его содержимое на экране. Обратите внимание, что этот код Python должен выполняться в том же каталоге, где находится файл example.txt.
Это показалось слишком сложным? Вот менее подробная версия:
Вот как читать этот файл построчно, используя цикл for:
(Примечание: если вы уже получаете сообщение об ошибке FileNotFoundError — этого почти следовало ожидать. Продолжайте читать!)
Все еще кажется слишком сложным? Что ж, нельзя обойти стороной тот факт, что на программном уровне открытие файла отличается от чтения его содержимого. Мало того, мы также должны вручную закрыть файл.
А теперь давайте рассмотрим это шаг за шагом.
Чтобы открыть файл, мы просто используем метод open() и передаем в качестве первого аргумента имя файла:
Это кажется достаточно простым, так что давайте перейдем к некоторым распространенным ошибкам.
Как напортачить при открытии файла
Вероятно, это самая распространенная ошибка, которая возникает при попытке открыть файл.
На самом деле, я видел, как студенты тратили десятки часов, пытаясь пройти мимо этого сообщения об ошибке, потому что они не останавливались, чтобы прочитать его. Итак, прочтите: что означает FileNotFoundError?
Попробуйте поставить пробелы там, где заглавные буквы:
Вы получите эту ошибку, потому что попытались открыть файл, которого просто не существует. Иногда это простая опечатка, когда вы пытаетесь открыть() файл с именем "example.txt", но случайно пишете его как "exmple.txt" .
Но чаще всего это происходит потому, что вы знаете, что файл существует под заданным именем файла, например "example.txt", но как ваш код Python узнает, где находится этот файл? Это «example.txt», который существует в вашей папке «Загрузки»? Или тот, который может существовать в папке «Документы»? Или тысячи других папок на вашем компьютере?
Это довольно сложный вопрос. Но первый шаг к тому, чтобы не тратить время попусту, заключается в том, что если вы когда-нибудь увидите эту ошибку, прекратите все, что вы делаете. Не настраивайте свой запутанный цикл for. Не пытайтесь установить новую библиотеку Python. Не перезагружайте компьютер, а затем повторно запустите скрипт, чтобы посмотреть, устранится ли ошибка волшебным образом.
Ошибка FileNotFoundError возникает из-за того, что вы либо не знаете, где на самом деле находится файл на вашем компьютере. Или, даже если вы знаете, вы не знаете, как сообщить вашей программе Python, где она находится. Не пытайтесь исправить другие части кода, не связанные с указанием имен файлов или путей.
Как исправить ошибку FileNotFoundError
Вот надежное решение: убедитесь, что файл действительно существует.
Давайте начнем с нуля, допустив ошибку. В системной оболочке (например, в терминале) перейдите в папку на рабочем столе:
Теперь запустите ipython:
Теперь, когда вы находитесь в интерактивном интерпретаторе Python, попробуйте открыть файл с именем, которое, как вы знаете, не существует на вашем рабочем столе, а затем насладитесь сообщением об ошибке:
Теперь вручную создайте файл на рабочем столе, используя Sublime Text 3 или что угодно. Добавьте к нему текст и сохраните его.
Посмотрите и убедитесь сами, что этот файл действительно существует в папке вашего рабочего стола:
Хорошо, теперь вернитесь к интерактивной оболочке Python (т. е. ipython), которую вы открыли после перехода в папку рабочего стола (т. е. cd ~/Desktop ). Повторно запустите эту команду open(), которая привела к ошибке FileNotFoundError:
Надеюсь, вы не получите ошибку.
Но что это за объект, на который указывает переменная myfile? Используйте метод type(), чтобы выяснить это:
И что это это? Детали не важны, за исключением того, что myfile определенно не является просто строковым литералом, то есть str .
Используйте автозаполнение Tab (т. е. введите myfile. ), чтобы получить список существующих методов и атрибутов для объекта myfile:
Ну, мы можем делать с файлами намного больше, чем просто читать из них(). Но давайте пока сосредоточимся только на чтении.
Предполагая, что переменная myfile указывает на какой-то файловый объект, вот как вы читаете из него:
Что находится в этой переменной mystuff? Снова используйте функцию type():
Это просто строка.Это, конечно же, означает, что мы можем его распечатать:
Или посчитайте количество символов:
Или распечатайте его заглавными буквами:
И это все, что нужно для чтения из открытого файла.
Теперь об ошибках.
Как ошибиться при чтении из файла
Вот очень, очень распространенная ошибка:
Вывод ошибки:
Обратите внимание, что это не ошибка FileNotFoundError. Это AttributeError — что, правда, не очень понятно — но читайте следующую часть:
Сообщение об ошибке попадает в точку: объект str — т. е. строковый литерал, например. что-то вроде "hello world" не имеет атрибута чтения.
Пересмотр ошибочного кода:
Если имя файла указывает на "example.txt", то имя файла является просто объектом str.
Другими словами, имя файла не является файловым объектом. Вот более наглядный пример ошибочного кода:
И бить в точку про голову:
Почему это такая распространенная ошибка? Потому что в 99% наших типичных взаимодействий с файлами мы видим имя файла в графическом интерфейсе нашего рабочего стола и дважды щелкаем это имя файла, чтобы открыть его. Графический интерфейс запутывает процесс — и не зря. Кого волнует, что происходит, если мой файл открывается, когда я дважды щелкаю по нему!
К сожалению, нам приходится проявлять осторожность при попытке чтения файла программным способом. Открытие файла — это отдельная операция от его чтения.
- Вы открываете файл, передавая его имя файла – например, example.txt — в функцию open(). Функция open() возвращает файловый объект.
- Чтобы фактически прочитать содержимое файла, вы вызываете метод read() этого файлового объекта.
Опять же, вот код, но немного более подробный:
Файловый объект также имеет метод close(), который формально очищает открытый файл и позволяет другим программам безопасно обращаться к нему. Опять же, это низкоуровневая деталь, о которой вы никогда не думаете в повседневных вычислениях. На самом деле, это то, что вы, вероятно, забудете в контексте программирования, поскольку не закрытие файла ничего автоматически не сломает (по крайней мере, пока мы не начнем выполнять гораздо более сложные типы файловых операций, по крайней мере…) . Как правило, после завершения скрипта все незакрытые файлы автоматически закрываются.
Однако мне нравится закрывать файл явным образом — не только из соображений безопасности, но и для закрепления концепции файлового объекта.
Одним из преимуществ более детального изучения открытия и чтения файлов является то, что теперь у нас есть возможность читать файлы построчно, а не одним гигантским фрагментом. Опять же, чтобы прочитать файлы как один гигантский фрагмент содержимого, используйте метод read():
Сейчас это не кажется такой уж большой проблемой, но это потому, что example.txt, вероятно, содержит всего несколько строк. Но когда мы имеем дело с огромными файлами — такими как все 3,3 миллиона записей о всех, кто пожертвовал более 200 долларов одному комитету президентской кампании в США в 2012 году или о всех, кто когда-либо посещал Белый дом, — открывается и чтение файла сразу заметно медленнее. И это может даже привести к сбою вашего компьютера.
Если вам интересно, почему в программах для работы с электронными таблицами, таких как Excel, существует ограничение на количество строк (примерно 1 000 000), то это потому, что большинство пользователей делают работу с файлом данных одновременно. Однако многие интересные файлы данных слишком велики для этого. Мы столкнемся с этими сценариями позже в этом квартале.
На данный момент вот как обычно выглядит построчное чтение:
Поскольку каждая строка в текстовом файле имеет символ новой строки (который представлен как \n, но обычно является «невидимым»), вызов функции print() создаст вывод с двойным интервалом, поскольку print() добавляет новую строку к тому, что он выводит (т.е. вернитесь к исходной программе print("hello world")).
Чтобы избавиться от этого эффекта, вызовите метод strip(), принадлежащий объектам str и удаляющий пробельные символы с левой и правой стороны текстовой строки:
И, конечно же, вы можете сделать вещи громче с помощью старой доброй функции upper():
Это пока. Мы не рассмотрели, как писать в файл (что является гораздо более опасной операцией) — я оставлю это для отдельного урока. Но достаточно знать, что, работая с файлами как программист, мы должны быть более точными и конкретными в шагах.
Справочники и связанные материалы
Существует несколько способов представления вывода программы; данные могут быть распечатаны в удобочитаемой форме или записаны в файл для будущего использования. В этой главе обсуждаются некоторые возможности.
Вычислительные методы в гражданской сфере созданы Дэном Нгуеном в качестве онлайн-справочника для Стэнфордской лаборатории вычислительной журналистики и программы магистратуры по журналистике.
Если вы выйдете из интерпретатора Python и войдете в него снова, сделанные вами определения (функции и переменные) будут потеряны.Поэтому, если вы хотите написать несколько более длинную программу, вам лучше использовать текстовый редактор, чтобы подготовить ввод для интерпретатора и вместо этого запустить его с этим файлом в качестве ввода. Это называется созданием скрипта. По мере того, как ваша программа становится длиннее, вы можете разделить ее на несколько файлов для облегчения обслуживания. Вы также можете использовать удобную функцию, написанную вами в нескольких программах, не копируя ее определение в каждую программу.
Для этого в Python есть способ поместить определения в файл и использовать их в сценарии или в интерактивном экземпляре интерпретатора. Такой файл называется модулем; определения из модуля можно импортировать в другие модули или в главный модуль (набор переменных, к которым у вас есть доступ в скрипте, выполняемом на верхнем уровне, и в калькуляторе). режим).
Модуль — это файл, содержащий определения и операторы Python. Имя файла — это имя модуля с добавленным суффиксом .py. Внутри модуля имя модуля (в виде строки) доступно как значение глобальной переменной __name__. Например, с помощью вашего любимого текстового редактора создайте файл fibo.py в текущем каталоге со следующим содержимым:
Теперь войдите в интерпретатор Python и импортируйте этот модуль с помощью следующей команды:
Это не вводит имена функций, определенных в fibo, непосредственно в текущую таблицу символов; он вводит туда только имя модуля fibo. Используя имя модуля, вы можете получить доступ к функциям:
Если вы собираетесь часто использовать функцию, вы можете присвоить ей локальное имя:
6.1. Подробнее о модулях¶
Модуль может содержать исполняемые операторы, а также определения функций. Эти операторы предназначены для инициализации модуля. Они выполняются только в первый раз, когда имя модуля встречается в операторе импорта. 1 (Они также запускаются, если файл выполняется как скрипт.)
Каждый модуль имеет свою собственную таблицу символов, которая используется в качестве глобальной таблицы символов всеми функциями, определенными в модуле. Таким образом, автор модуля может использовать глобальные переменные в модуле, не беспокоясь о случайных столкновениях с глобальными переменными пользователя. С другой стороны, если вы знаете, что делаете, вы можете обращаться к глобальным переменным модуля с той же нотацией, которая используется для обозначения его функций, modname.itemname .
Модули могут импортировать другие модули. Обычно, но не обязательно, все операторы импорта помещаются в начало модуля (или скрипта, если уж на то пошло). Имена импортированных модулей помещаются в глобальную таблицу символов импортирующего модуля.
Существует вариант оператора импорта, который импортирует имена из модуля непосредственно в таблицу символов импортирующего модуля. Например:
Это не вводит имя модуля, из которого берутся импорты, в локальную таблицу символов (поэтому в примере фибо не определено).
Существует даже вариант импорта всех имен, определенных модулем:
При этом импортируются все имена, кроме тех, которые начинаются с символа подчеркивания ( _ ). В большинстве случаев программисты Python не используют эту возможность, поскольку она вводит в интерпретатор неизвестный набор имен, возможно, скрывая некоторые вещи, которые вы уже определили.
Обратите внимание, что обычно практика импорта * из модуля или пакета осуждается, так как это часто приводит к плохо читаемому коду. Однако его можно использовать для экономии ввода в интерактивных сеансах.
Если за именем модуля следует as , то имя после as напрямую связано с импортированным модулем.
Это фактически импортирует модуль так же, как это делает import fibo, с той лишь разницей, что он доступен как fib .
Его также можно использовать при использовании from с аналогичными эффектами:
Из соображений эффективности каждый модуль импортируется только один раз за сеанс интерпретатора. Поэтому, если вы меняете свои модули, вы должны перезапустить интерпретатор — или, если вы хотите протестировать только один модуль в интерактивном режиме, используйте importlib.reload() , например импортировать импортную библиотеку; importlib.reload(имя модуля) .
6.1.1. Выполнение модулей как скриптов¶
Когда вы запускаете модуль Python с
код в модуле будет выполнен так же, как если бы вы его импортировали, но с __name__, установленным на "__main__" . Это означает, что, добавив этот код в конец вашего модуля:
вы можете сделать файл пригодным для использования как скрипт, а также как импортируемый модуль, потому что код, анализирующий командную строку, запускается только в том случае, если модуль выполняется как «основной» файл:
Если модуль импортирован, код не запускается:
Это часто используется либо для предоставления удобного пользовательского интерфейса модулю, либо для целей тестирования (запуск модуля как сценария выполняет набор тестов).
6.1.2. Путь поиска модуля¶
Когда импортируется модуль с именем spam, интерпретатор сначала ищет встроенный модуль с таким именем.Если он не найден, он ищет файл с именем spam.py в списке каталогов, заданном переменной sys.path. sys.path инициализируется из следующих мест:
Каталог, содержащий входной скрипт (или текущий каталог, если файл не указан).
PYTHONPATH (список имен каталогов с тем же синтаксисом, что и переменная оболочки PATH ).
Зависимое от установки значение по умолчанию (по соглашению включает каталог site-packages, обрабатываемый модулем site).
В файловых системах, поддерживающих символические ссылки, каталог, содержащий входной скрипт, вычисляется после перехода по символической ссылке. Другими словами, каталог, содержащий символическую ссылку, не добавляется в путь поиска модуля.
После инициализации программы Python могут изменять sys.path . Каталог, содержащий выполняемый скрипт, помещается в начало пути поиска перед стандартным путем библиотеки. Это означает, что скрипты в этом каталоге будут загружены вместо одноименных модулей в каталоге библиотеки. Это ошибка, если замена не предназначена. Дополнительную информацию см. в разделе Стандартные модули.
6.1.3. «Скомпилированные» файлы Python¶
Чтобы ускорить загрузку модулей, Python кэширует скомпилированную версию каждого модуля в каталоге __pycache__ под именем module. версия .pyc , где версия кодирует формат скомпилированного файла; обычно он содержит номер версии Python. Например, в выпуске CPython 3.3 скомпилированная версия spam.py будет кэшироваться как __pycache__/spam.cpython-33.pyc. Это соглашение об именах позволяет сосуществовать скомпилированным модулям из разных выпусков и разных версий Python.
Python сравнивает дату модификации исходного кода с скомпилированной версией, чтобы определить, не устарела ли она и не нуждается ли она в повторной компиляции. Это полностью автоматический процесс. Кроме того, скомпилированные модули не зависят от платформы, поэтому одну и ту же библиотеку можно использовать в системах с разной архитектурой.
Python не проверяет кэш в двух случаях. Во-первых, он всегда перекомпилирует и не сохраняет результат для модуля, загруженного непосредственно из командной строки. Во-вторых, он не проверяет кэш, если нет исходного модуля. Для поддержки не исходного (только скомпилированного) дистрибутива скомпилированный модуль должен находиться в исходном каталоге, и не должно быть исходного модуля.
Несколько советов для экспертов:
Вы можете использовать ключи -O или -OO в команде Python, чтобы уменьшить размер скомпилированного модуля. Переключатель -O удаляет утверждения утверждений, переключатель -OO удаляет как утверждения утверждений, так и строки __doc__. Поскольку некоторые программы могут полагаться на их доступность, вам следует использовать эту опцию только в том случае, если вы знаете, что делаете. «Оптимизированные» модули имеют тег opt-tag и обычно меньше по размеру. В будущих версиях результаты оптимизации могут быть изменены.
При чтении из файла .pyc программа работает не быстрее, чем при чтении из файла .py; единственное, что быстрее в файлах .pyc, — это скорость их загрузки.
Модуль compileall может создавать файлы .pyc для всех модулей в каталоге.
Подробнее об этом процессе, включая блок-схему решений, см. в PEP 3147.
6.2. Стандартные модули¶
Python поставляется с библиотекой стандартных модулей, описанных в отдельном документе — Справочнике по библиотеке Python (далее — «Справочник по библиотеке»). Некоторые модули встроены в интерпретатор; они обеспечивают доступ к операциям, которые не являются частью ядра языка, но, тем не менее, встроены либо для повышения эффективности, либо для предоставления доступа к примитивам операционной системы, таким как системные вызовы. Набор таких модулей является опцией конфигурации, которая также зависит от базовой платформы. Например, модуль winreg предоставляется только в системах Windows. Отдельного внимания заслуживает один конкретный модуль: sys, встроенный в каждый интерпретатор Python. Переменные sys.ps1 и sys.ps2 определяют строки, используемые в качестве основных и дополнительных подсказок:
Эти две переменные определяются только в том случае, если интерпретатор находится в интерактивном режиме.
Переменная sys.path представляет собой список строк, определяющих путь поиска модулей интерпретатором. Он инициализируется путем по умолчанию, взятым из переменной среды PYTHONPATH или из встроенного значения по умолчанию, если PYTHONPATH не задан. Вы можете изменить его, используя стандартные операции со списками:
6.3. Функция dir()¶
Встроенная функция dir() используется для определения имен, определяемых модулем. Он возвращает отсортированный список строк:
Без аргументов dir() перечисляет имена, которые вы определили в данный момент:
Обратите внимание, что в нем перечислены все типы имен: переменные, модули, функции и т. д.
dir() не перечисляет имена встроенных функций и переменных. Если вам нужен их список, они определены в стандартных встроенных модулях:
6.4. Пакеты¶
Пакеты — это способ структурирования пространства имен модулей Python с помощью «точечных имен модулей». Например, имя модуля A.B обозначает подмодуль с именем B в пакете с именем A. Точно так же, как использование модулей избавляет авторов разных модулей от необходимости беспокоиться об именах глобальных переменных друг друга, использование имен модулей с точками избавляет авторов многомодульных пакетов, таких как NumPy или Pillow, от необходимости беспокоиться об именах модулей друг друга. .
Предположим, вы хотите разработать набор модулей («пакет») для единообразной обработки звуковых файлов и звуковых данных. Существует множество различных форматов звуковых файлов (обычно распознаваемых по их расширениям, например: .wav, .aiff, .au), поэтому вам может потребоваться создать и поддерживать растущую коллекцию модулей для преобразования между различными форматами файлов. Существует также множество различных операций, которые вы, возможно, захотите выполнить со звуковыми данными (например, микширование, добавление эха, применение функции эквалайзера, создание искусственного стереоэффекта), так что, кроме того, вы будете писать нескончаемый поток модулей для выполнения. эти операции. Вот возможная структура вашего пакета (выраженная в терминах иерархической файловой системы):
При импорте пакета Python просматривает каталоги sys.path в поисках подкаталога пакета.
Файлы __init__.py необходимы для того, чтобы Python рассматривал каталоги, содержащие файл, как пакеты. Это предотвращает непреднамеренное сокрытие допустимых модулей каталогами с общим именем, таким как string , которые встречаются позже на пути поиска модулей. В простейшем случае __init__.py может быть просто пустым файлом, но он также может выполнять код инициализации пакета или устанавливать переменную __all__, описанную ниже.
Пользователи пакета могут импортировать отдельные модули из пакета, например:
Это загружает подмодуль sound.effects.echo. На него должно указываться его полное имя.
Альтернативный способ импорта подмодуля:
Это также загружает подмодуль echo и делает его доступным без префикса пакета, поэтому его можно использовать следующим образом:
Еще один вариант — импортировать нужную функцию или переменную напрямую:
Опять же, это загружает подмодуль echo , но делает его функцию echofilter() доступной напрямую:
Обратите внимание, что при использовании элемента импорта из пакета элемент может быть либо подмодулем (или подпакетом) пакета, либо каким-либо другим именем, определенным в пакете, например, функцией, классом или переменной. Оператор импорта сначала проверяет, определен ли элемент в пакете; если нет, он предполагает, что это модуль, и пытается загрузить его. Если его не удается найти, возникает исключение ImportError.
Наоборот, при использовании синтаксиса наподобие import item.subitem.subsubitem каждый элемент, кроме последнего, должен быть пакетом; последний элемент может быть модулем или пакетом, но не может быть классом, функцией или переменной, определенной в предыдущем элементе.
6.4.1. Импорт * из пакета¶
Что происходит, когда пользователь пишет из sound.effects import * ? В идеале можно было бы надеяться, что это каким-то образом выйдет в файловую систему, найдет, какие подмодули присутствуют в пакете, и импортирует их все. Это может занять много времени, а импорт подмодулей может привести к нежелательным побочным эффектам, которые должны иметь место только при явном импорте подмодуля.
Единственным решением для автора пакета является предоставление явного индекса пакета. В операторе импорта используется следующее соглашение: если код пакета __init__.py определяет список с именем __all__ , он считается списком имен модулей, которые следует импортировать, когда встречается from package import *. Автор пакета должен поддерживать этот список в актуальном состоянии при выпуске новой версии пакета. Авторы пакетов также могут принять решение не поддерживать его, если они не видят смысла в импорте * из своего пакета. Например, файл sound/effects/__init__.py может содержать следующий код:
Это будет означать, что из sound.effects import * будут импортированы три именованных подмодуля звукового пакета.
Если __all__ не определено, инструкция из sound.effects import * не импортирует все подмодули из пакета sound.effects в текущее пространство имен; это только гарантирует, что пакет sound.effects был импортирован (возможно, запуск любого кода инициализации в __init__.py ), а затем импортирует любые имена, определенные в пакете. Сюда входят любые имена, определенные (и явно загруженные подмодули) с помощью __init__.py. Он также включает любые подмодули пакета, которые были явно загружены предыдущими операторами импорта. Рассмотрим этот код:
В этом примере модули эха и объемного звучания импортируются в текущее пространство имен, поскольку они определены в пакете sound.effects, когда файл from. выполняется оператор импорта. (Это также работает, когда определено __all__.)
Несмотря на то, что некоторые модули предназначены для экспорта только тех имен, которые соответствуют определенным шаблонам при использовании import * , это по-прежнему считается плохой практикой в производственном коде.
Помните, что нет ничего плохого в использовании from package importspecific_submodule ! На самом деле это рекомендуемая нотация, если импортирующему модулю не нужно использовать подмодули с одинаковыми именами из разных пакетов.
6.4.2. Внутрипакетные ссылки¶
Когда пакеты структурированы в подпакеты (как в случае со звуковым пакетом в примере), вы можете использовать абсолютный импорт для ссылки на подмодули одноуровневых пакетов. Например, если модулю sound.filters.vocoder необходимо использовать модуль echo в пакете sound.effects, он может использовать from sound.effects import echo .
Вы также можете написать относительный импорт с формой имени импорта из модуля в операторе импорта. Эти импорты используют начальные точки для обозначения текущего и родительского пакетов, участвующих в относительном импорте. Например, из модуля объемного звучания вы можете использовать:
Обратите внимание, что относительный импорт основан на имени текущего модуля. Поскольку имя основного модуля всегда "__main__" , модули, предназначенные для использования в качестве основного модуля приложения Python, всегда должны использовать абсолютный импорт.
6.4.3. Пакеты в нескольких каталогах¶
Пакеты поддерживают еще один специальный атрибут — __path__ . Он инициализируется как список, содержащий имя каталога, содержащего __init__.py пакета, до выполнения кода в этом файле. Эту переменную можно изменить; это повлияет на дальнейший поиск модулей и подпакетов, содержащихся в пакете.
Хотя эта функция требуется нечасто, ее можно использовать для расширения набора модулей в пакете.
Фактически определения функций также являются «операторами», которые «выполняются»; выполнение определения функции на уровне модуля вводит имя функции в глобальную таблицу символов модуля.
Импорт файлов для локальной разработки в Python может быть громоздким. В этой статье я обобщаю некоторые возможности для разработчиков Python.
TL; ДР: Я рекомендую использовать python -m для запуска файла Python, чтобы добавить текущий рабочий каталог в sys.path и включить относительный импорт.
Определения
Сценарий: файл Python, предназначенный для запуска с интерфейсом командной строки.
Модуль: файл Python, предназначенный для импорта.
Пакет: каталог, содержащий модули/пакеты.
Пример
Скажем, в b.py мы хотим использовать d.py:
Попробуем запустить python из каталога проекта:
Что случилось? Когда Python пытается импортировать модуль, он просматривает пути в sys.path (включая, помимо прочего, PYTHONPATH):
Мы видим, что каталог, содержащий b.py (скрипт, который мы запускаем), добавляется в sys.path. Но d.py недоступен из каталога a , отсюда и вышеуказанная ошибка.
1-е решение: добавить root в sys.path
Мы можем добавить путь к корню проекта:
Добавленный путь «.» относится к текущему рабочему каталогу (из которого был запущен Python) ~/Documents/code/project. Python действительно может импортировать c.d из этого каталога.
Это решение работает независимо от каталога, используемого для запуска Python:
Благодаря Pathlib, он также должен работать на другом компьютере с другой файловой системой или ОС.
Однако изменение sys.path в начале каждого файла утомительно и сложно в обслуживании. Лучшим решением было бы использовать файл context.py, изменяющий sys.path и импортируемый каждым другим файлом, но это все еще неудовлетворительно.
Другая возможность — добавить корневой каталог в PYTHONPATH (перед запуском скрипта). Например, поэзия делает это автоматически.
Относительный импорт
Относительный импорт был введен в PEP 328 как способ улучшить ремонтопригодность и избежать очень длинных операторов импорта. Они должны использовать синтаксис from .module import something:
Это не работает! Действительно, относительный импорт зависит от переменной __name__ или __package__ (которая для скрипта равна __main__ и None соответственно).
Если мы импортируем b.py из другого файла, все в порядке:
Примечание: чтобы перейти на несколько каталогов выше в относительном импорте, используйте дополнительные точки: from . c import d, например, переместится на 2 каталога вверх.
Второе решение: запустить как модуль
К сожалению, скрипты не могут использовать относительный импорт. PEP 338 преодолевает это ограничение, добавляя параметр -m. С этой опцией скрипт запускается так, как если бы он был импортирован как модуль.
python3 -m src.a.b действует так, как если бы файл Python, содержащий import src.a.b, был запущен в текущем каталоге, с двумя заметными отличиями:
Поскольку я не вижу в этом никаких недостатков, я рекомендую всегда использовать python3 -m для запуска скрипта.
Запускать как модуль в Visual Code
Конфигурация запуска по умолчанию в Visual Code запускает файлы Python как сценарии (без -m ). В этом выпуске GitHub объясняется, как автоматически добавлять -m:
- добавьте расширение «Командная переменная» в Visual Code
- задайте следующую конфигурацию запуска Python в файле settings.json:
3-е решение: изменить PYTHONPATH
С помощью Visual Code вы можете автоматически добавить корневой каталог в свой проект, добавив строку в конфигурацию запуска:
Я не вижу файлы, существующие на Pico с проводником
Обсуждение и вопросы о досках, на которых может работать MicroPython, но нет специального форума.
Целевая аудитория: все, кто заинтересован в использовании MicroPython на другом оборудовании.
Я не вижу файлы, существующие на Pico с проводником
Если я перетащу туда файлы, я их увижу, но после выключения и повторного включения они исчезнут.
Используя Thonny с интерпретатором Pico, я несколько раз устанавливал Python НА Pico, но, по-видимому, он не остается там, потому что каждый раз спрашивает меня, отключаю ли я питание.
Итак, я пишу код, например, внешний светодиодный сигнализатор, сохраняю его в Pico и выполняю. Это работает нормально. отключите пико, подключите его снова, и я не вижу его в проводнике Windows.
НО, похоже, он есть. Если я скажу Тонни открыть файл на пиколе, он увидит все мои старые файлы, кроме тех, которые я перетаскиваю.
Кто-то сказал, что нельзя нажимать кнопку выбора загрузки, когда я загружаюсь.
Я пытался это сделать, но затем Pico не отображается в проводнике. НО все еще кажется доступным от Тонни.
Так эти файлы сохраняются на Pico или нет? и если да, то почему я не вижу их в Проводнике?
Как установить Python на Pico навсегда?
Так эти файлы сохраняются на Pico или нет? и если да, то почему я не вижу их в Проводнике?
Как установить Python на Pico навсегда?
Pico работает немного иначе, чем другие платы MicroPython, такие как pyboard (или почти все платы CircuitPython), которые представляют собой запоминающее устройство USB.
На Pico USB-накопитель используется только для загрузчика (обозначается как «UF2»). Вы используете это _только_ для установки прошивки на плату (например, прошивки MicroPython).
После установки MicroPython останется установленным навсегда. Когда MicroPython работает, устройство представляет собой всего лишь последовательный порт USB, и такие инструменты, как Thonny, взаимодействуют с последовательным портом для составления списка и передачи файлов.
хорошо, я удерживал кнопку загрузчика нажатой, когда подключал его, и услышал звук соединения.
Открыл Thonny, и он спросил, хочу ли я установить на компьютер или Pico, и я выбрал Pico.
Он установил и сказал, что готово.
Я закрыл Тонни и снова открыл его.
Оболочка работала и сообщала: MicroPython v1.14 от 02 февраля 2021 г.; Raspberry Pi Pico с RP2040
Итак, Тонни взаимодействует с Pico
Я нажимаю открыть, и он спрашивает, открывать ли файлы с компьютера или Pico
Я выбираю Pico, и он перечисляет файлы, которые я написал и сохранил, по-видимому, на Pico?
Похоже, это противоречит тому, что вы сказали, что USB-накопитель используется только для загрузчика.
А как бы мои сценарии работали для встроенных проектов, если бы их не было на борту?
Должно быть, у меня ментальный блок, но иногда бывает.
И если Pico хранит сценарии, как я могу перенести на него библиотеки?
Должен ли я копировать и вставлять их в Thonny, а затем сохранять в Pico?
Это кажется немного архаичным для современного устройства, но я не понимаю, как управлять (перемещать) файлами в Thonny.
Есть функция перемещения/переименования, но она только переименовывает, на самом деле она не перемещается.
Спасибо за ответ!!
Я выбираю Pico, и в нем перечислены файлы, которые я написал и сохранил, очевидно, на Pico?
Похоже, это противоречит тому, что вы сказали, что USB-накопитель используется только для загрузчика.
А как бы мои скрипты работали для встроенных проектов, если бы их не было на борту?
Ваши скрипты находятся на устройстве, они просто не открываются через USB-накопитель. Вместо этого вам нужно каким-то образом получить к ним доступ через MicroPython. Тонни сделает это за тебя. Например, когда вы просите Тони сохранить сценарий на устройстве, за кулисами на MicroPython REPL вашего устройства происходит нечто подобное (упрощенное):
Чтобы получить список файлов на устройстве, Тонни использует os.listdir() и т. д.
И если Pico хранит сценарии, как я могу перенести на него библиотеки?
Должен ли я копировать и вставлять их в Thonny, а затем сохранять в Pico?
Для передачи файлов, которые вы не хотите редактировать в Thonny, вам следует открыть файловый браузер Thonny (View => Files). Чтобы загрузить библиотеку:
* в верхней панели перейдите к его местоположению на локальном диске (дважды щелкните каталог, чтобы перейти в него)
* перейдите в каталог "lib" в нижней панели (используйте маленькую кнопку-сэндвич для " Создать новый каталог")
* щелкните правой кнопкой мыши исходный файл/каталог и выберите "Загрузить в /lib".
Новые Pythonисты нередко сталкиваются с проблемами при установке пакетов и использовании своих модулей. Подобные досадные ошибки часто возникают, даже если вы считаете, что правильно установили пакет:
Это вызвано тем, что версия Python, в которой вы запускаете скрипт, не настроена на поиск модулей там, где вы их установили. Это происходит, когда вы используете неправильную установку pip для установки пакетов.
Как правило, каждая установка Python поставляется вместе с собственным исполняемым файлом pip, используемым для установки пакетов. По умолчанию этот исполняемый файл pip устанавливает пакеты в место, где их может найти конкретная установка Python.
Проблема в том, что очень часто установлено несколько интерпретаторов Python (и, соответственно, несколько исполняемых файлов pip). В зависимости от PATH вашей оболочки запуск pip может вызвать исполняемый файл pip, связанный с используемой вами версией Python, или к другому. Если вызывается неправильный pip, то устанавливаемые им пакеты, скорее всего, не будут видны используемому вами интерпретатору Python, что приведет к ошибке ImportError .
Чтобы использовать версию pip для нужной версии Python, вы можете использовать python -m pip . Здесь python — это путь к нужному интерпретатору Python, поэтому что-то вроде /usr/local/bin/python3.7 -m pip будет использовать исполняемый файл pip для /usr/local/bin/python3.7 . Однако у этого все еще есть свои ограничения.
Есть и другие способы обойти эту проблему. Вы можете изменить PATH вашей оболочки, чтобы он использовал правильный исполняемый файл pip, или изменить PYTHONPATH, чтобы нужная версия Python могла находить пакеты, расположенные в другом каталоге. Но все это может быстро запутаться.
Вместо этого часто используются виртуальные среды, чтобы изолировать установки Python друг от друга. Виртуальная среда содержит, среди прочего, интерпретатор Python, исполняемый файл pip и каталог site-packages, который является стандартным расположением для большинства пакетов, загружаемых с помощью pip .
Активируя виртуальную среду в своей оболочке, вы предоставляете ей доступ только к исполняемым файлам pip и Python, установленным в вашей виртуальной среде, гарантируя, что будут вызываться правильные версии обоих приложений и что пакеты всегда будут установлены в нужное место. Виртуальные среды также позволяют запускать разные версии одного и того же пакета с разными проектами, что невозможно, если вы используете глобальную установку Python.
Существует множество различных виртуальных сред на выбор. В этом курсе используется Conda в комплекте с Anaconda. Вы можете узнать больше о виртуальных средах в разделе Работа с виртуальными средами Python.
Читайте также:
- Звуковая подсистема Discord, что является устаревшим стандартом
- Сколько стоила PS4 при запуске
- Название каждой профессии соедините в левом столбце строкой с описанием возможностей компьютера
- Какому коммерческому продукту принадлежит программное обеспечение dr web для почтовых серверов kerio
- Как переименовать файл в Java