Импорт Python из родительского каталога: краткое руководство

Импорт Python из родительского каталога: краткое руководство

Вы когда-нибудь оказывались по колено в файлах Python, пытаясь импортировать модуль из родительского каталога? Если да, то вы в хорошей компании. Система импорта Python иногда может показаться извилистым лабиринтом, но не волнуйтесь, мы здесь, чтобы помочь вам сориентироваться!

Для импорта из родительского каталога в Python вы можете использовать модуль sys . Вставив требуемый каталог в список sys.path, вы сообщаете интерпретатору расположение нужного модуля. После изменения sys.path вы можете импортировать целевой модуль, используя стандартный оператор импорта.

Импорт Python из родительского каталога: краткое руководство

В этой статье мы рассмотрим, как вы можете импортировать из родительских каталогов в Python. Кроме того, мы рассмотрим конкретные варианты использования импорта, которые помогут вам лучше понять базовую структуру каталогов.

Давайте погрузимся в это!

Оглавление

Как импортировать в Python

Мы собираемся перейти прямо к сегодняшней теме: импорту в Python. Те простые строки кода в начале ваших скриптов Python, которые часто начинаются с import или from ? Это ваш билет к использованию возможностей обширных библиотек и модулей Python.

В этом разделе мы рассмотрим код для импорта из родительского каталога в Python. Мы также рассмотрим возможные ошибки, которые могут возникнуть при импорте модулей из родительского каталога.

Что такое система импорта Python?

Система импорта Python обеспечивает эффективное повторное использование и организацию кода. Это упрощает поддержку сложных проектов.

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

Чтобы импортировать модуль из родительского каталога, вы можете использовать модуль sys.path , чтобы добавить родительский каталог к ​​пути Python. После добавления родительского каталога вы можете импортировать модуль с помощью оператора импорта .

Демонстрация импорта из родительского каталога

Чтобы дать вам четкую демонстрацию импорта из родительского каталога, давайте рассмотрим ряд шагов, которые помогут вам понять весь процесс.

1. Создание необходимых каталогов и файлов

Сначала откройте проводник и перейдите к нужному локальному диску. Я использую свой локальный диск E, поэтому я создам новый каталог с именем my_project .

Внутри my_project создайте другой каталог с именем module_dir .

Итак, теперь у вас должно быть:

E:
|-- /my_project
    |-- /module_dir

2. Добавление файлов Python

Затем создайте новый файл .py с именем main.py в каталоге my_project .

После этого создайте еще один файл Python с именем my_module.py в module_dir .

Теперь ваша структура должна выглядеть так:

E:
|-- /my_project
    |-- main.py
    |-- /module_dir
        |-- my_module.py

Если вы используете Visual Studio Code , ваша структура каталогов должна выглядеть следующим образом:

Импорт Python из родительского каталога: краткое руководство

3. Редактирование файлов Python

Откройте свой my_module.py и добавьте следующий код:

def my_function():
    print("Hello from my_module!")

Затем сохраните и закройте файл.

Теперь откройте main.py и добавьте следующий код:

import sys
import os

# Get the parent directory
parent_dir = os.path.dirname(os.path.realpath(__file__))

# Add the parent directory to sys.path
sys.path.append(parent_dir)

# Import the module from the parent directory
from module_dir import my_module

# Use a function from my_module
my_module.my_function()

В этом скрипте мы сначала выясняем местоположение каталога на один уровень выше, чем скрипт, который мы запускаем (это родительский каталог). Затем мы говорим Python также искать в этой родительской папке, когда ему нужно импортировать модули.

После этого мы импортируем модуль с именем my_module , который находится внутри каталога с именем module_dir, расположенного в этом родительском каталоге. Наконец, мы вызываем функцию с именем my_function из my_module .

После добавления приведенного выше кода сохраните и закройте файл.

4. Запуск кода

Чтобы запустить этот код, откройте терминал нужного вам редактора кода и запустите файл main.py. Если вы используете Visual Studio Code, вывод должен выглядеть следующим образом:

Импорт Python из родительского каталога: краткое руководство

main.py импортирует функцию из my_module.py , как показано на изображении выше.

В этом примере подробно показано, как в Python работает файловая система и импорт из родительского каталога.

Как обрабатывать ImportError и ModuleNotFoundError в Python

Python вызовет исключение ImportError , если модуль, который вы пытаетесь импортировать, не будет найден в процессе импорта.

ImportError — это подкласс исключения ModuleNotFoundError . Он возникает, когда импортированный модуль не существует или не может быть загружен.

The following are examples of scenarios when these may occur:

  • The module or package is not in the sys.path.

  • The module or package name is misspelled or does not exist.

  • There is a problem with the module’s code, preventing it from being properly imported.

When encountering these errors, you could use the following solutions:

  • Double-checking the spelling and existence of the module or package.

  • Adding the necessary directory to sys.path using append() or insert().

  • Fixing any issues in the module’s code that may be hindering its import.

To learn more about handling errors in Python, check the following video out:

After understanding how importing works in Python, it’s also important that you gain some familiarity with Python’s directory structure.

Directory structure and importing go hand-in-hand with each other as importing requires an understanding of the directory structure, so let’s go over that in the next section.

Python Directory Structure

Understanding the Python directory structure is more than just knowing where to put your scripts or where to find that library you just installed.

It’s like having a clean, well-organized desk: you’ll know exactly where everything is, and your productivity will skyrocket, so let’s go over the basics in this section.

Package Structure

The directory structure of a Python project is essential for correct organization. If you structure your package properly, it’ll help you minimize the chance of naming conflicts. Furthermore, it’ll also enable you to easily navigate through your filesystem.

The following is a typical Python project directory structure:

project/
?
??? package1/
?   ??? __init__.py
?   ??? module1.py
?   ??? module2.py
?
??? package2/
?   ??? __init__.py
?   ??? module3.py
?   ??? module4.py
?
??? main.py

In the example above, project is the root directory containing two sub-packages, package1 and package2. Each package has its .py files and a unique init.py file.

What Are init.py Files?

init.py files are important for defining the package’s behavior when it’s imported. These files are executed when their parent package is imported.

The init.py files can be empty or contain initialization code. They also indicate to Python that the folder should be treated as a package.

To import a module from a parent directory, you can use the sys.path method. You’ll need to append the parent directory path to sys.path.

To demonstrate this, let’s build up on our previous example. We had the following directory structure:

E:
|-- /my_project
    |-- main.py
    |-- /module_dir
        |-- my_module.py

Now, let’s add the init.py file to my_module directory. You can leave this file empty for now. Its presence indicates to Python that this directory should be treated as a package.

Your directory structure should now look like the following:

Импорт Python из родительского каталога: краткое руководство

After adding the init.py file, you must make changes to your main.py file to instruct it to treat the module_dir folder as a package. Your main.py file should now have the following code:

import sys
import os

# Get the parent directory
parent_dir = os.path.dirname(os.path.realpath(__file__))

# Add the parent directory to sys.path
sys.path.append(parent_dir)

# Import my_module from the package module_dir
import module_dir

# Call my_function from my_module
my_module.my_function()

In this example, main.py imports the module_dir package, and then calls the function my_function() from my_module within that package.

Note the change in the call to the my_function; because we are now treating module_dir as a package, we have to include the package name when calling functions from modules within the package.

The output will be similar to the previous one. The only change we made was to treat module_dir as a package with the inclusion of init.py file.

Импорт Python из родительского каталога: краткое руководство

Python Search Path

Ever wondered how Python knows where to find the modules you’re trying to import? Or maybe you’ve encountered an annoying ‘ModuleNotFoundError’ and couldn’t figure out why?

In this section, we’re going to tackle these mysteries head-on and delve into the concept of the Python search path.

The Python search path, also known as sys.path, is Python’s little roadmap to finding all the modules you need. Like a diligent scout, Python uses this path to scour your computer for modules whenever you use the import statement.

Understanding how it works can save you from headaches and help you troubleshoot when things go awry, so let’s go over some basics!

1. What is the sys.path List in Python?

The sys.path list is a crucial component when importing modules in a directory. It’s a list of strings that represents the module search path.

Each string in the list is a directory location where Python looks for modules (*.py files) or packages (folders containing init.py files).

The following example shows you how to view your current sys.path list:

import sys

for path in sys.path:
    print(path)

After running the above code, you’ll see an output like the following:

Импорт Python из родительского каталога: краткое руководство

You can also add new directories to the sys.path list so that Python finds your custom modules.

For instance:

import sys
sys.path.append('/path/to/new/module/directory')

2. What are PythonPath Environment Variables?

Another way you can manage the module search path is by using the PYTHONPATH environment variable.

PYTHON PATH is a string containing a list of directories that is appended to the default sys.path list. This means you can add directories to PYTHONPATH. This allows Python to search for modules in those directories when importing.

Setting the PYTHONPATH environment variable depends on your operating system:

  • Unix-based systems (Linux, macOS): You can use the export command in your terminal or add the following line to your shell configuration file (.bashrc, .zshrc or similar):

    export PYTHONPATH="/path/to/module/directory1:/path/to/module/directory2"
  • Windows OS: Go to System Properties > Environment Variables, and under User variables, click New to create a new variable with the name: “PYTHONPATH” and the value as a list of directory paths separated by a semi-colon (;).

    C:pathtomoduledirectory1;C:pathtomoduledirectory2
    

Once the path variable is set, you can run your Python script. It will search for imported modules in those directories as well as the default ones in sys.path.

When organizing your code into files and folders, you’ll frequently come across relative imports and adjusting sys.path.

In the next section, we’ll explore both and see how they fit into the framework for Python imports.

Parent Directory Imports

You can organize code into different folders and files to improve both readability and maintainability. However, importing modules from parent directories can be a bit tricky.

In this section, we’ll discuss two approaches to achieve this:

  1. Relative Imports

  2. Adjusting sys.path

1. Relative Imports

Relative imports allow you to import modules based on their relative position in the directory hierarchy.

You can use the dot (.) notation to refer to the current directory or double dot (..) notation to refer to the parent directory.

Suppose you have a directory structure like the following:

parent_directory/
?
??? module_a.py
?
??? sibling_directory/
    ??? module_b.py

Inside module_b.py, you can use relative imports to access module_a.py:

from .. import module_a

The double dot refers to the parent directory. It is important to note that relative imports only work if the parent directory is a package (has an init.py file).

2. Adjusting sys.path

You can also import modules from a parent directory by modifying the sys.path.

Перед оператором импорта вы можете добавить путь к родительскому каталогу к sys.path . Во-первых, вам нужно импортировать модуль sys . Затем вы используете модуль os для получения пути к родительскому каталогу.

Предположим, у вас есть структура каталогов, подобная следующей:

project_root/
?
??? parent_directory/
?   ??? module_a.py
?
??? current_directory/
    ??? module_b.py

В module_b.py вы можете добавить путь к родительскому каталогу к sys.path следующим образом:

import os
import sys

parent_dir = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
sys.path.append(parent_dir)

import module_a

Теперь Python будет искать module_a.py в родительском каталоге при импорте в module_b.py .

Вы можете использовать подход относительного импорта или подход sys.path для импорта модулей из родительского каталога.

Как работать с модулями и пакетами

В Python модули и пакеты — это способ организации и повторного использования кода. Вы можете использовать их для разделения сложных проектов на управляемые части.

В этом разделе мы обсудим, как работать с модулями и пакетами в Python . Мы также включим ключевые понятия, такие как:

  1. Пространства имен

  2. Переменные и определения

  3. Операторы импорта

1. Что такое пространства имен?

Пространства имен в Python — это способ убедиться, что имена переменных, функций и классов не конфликтуют между разными модулями.

В Python существуют разные уровни пространств имен, например:

  • Глобальное пространство имен: относится к пространству имен всего модуля.

  • Локальное пространство имен: относится к пространству имен внутри функции или класса.

Вы можете получить имя в определенном пространстве имен с помощью нотации namespace[name] .

2. Что такое переменные и определения?

В сценарии Python вы можете определять переменные, функции и классы. Эти определения хранятся в пространстве имен скрипта.

Импортируя сценарий как пакет, вы можете получить доступ к его определениям и повторно использовать их в других частях вашего проекта.

Ниже приведен пример определения переменной и функции в одном и том же пространстве имен:

# my_variable.py
my_variable = 5

def my_function(x):
    return x + my_variable

В этом модуле есть переменная my_variable и функция my_function .

Чтобы запустить этот код, вы можете создать новый файл с именем my_variable.py и поместить туда код, как показано ниже:

Импорт Python из родительского каталога: краткое руководство

Теперь вы можете импортировать этот файл и использовать его в другом скрипте, как показано ниже:

Импорт Python из родительского каталога: краткое руководство

После запуска файла main.py вы получите вывод, подобный следующему:

Импорт Python из родительского каталога: краткое руководство

3. Что такое отчеты об импорте?

Вы можете импортировать файлы, модули или пакеты в Python с помощью оператора импорта

Некоторые распространенные методы импорта:

  • import module_name : этот метод импортирует модуль, делая все его определения доступными с помощью нотации module_name.definition_name .

import mymodule

result = mymodule.my_function(3)
  • from module_name import some_definition : этот метод импортирует конкретное определение из модуля, позволяя вам использовать его напрямую без префикса модуля.

from mymodule import my_function

result = my_function(3)
  • from module_name import * : этот метод импортирует все определения из модуля, но это не рекомендуется, так как это может привести к конфликтам имен.

Последние мысли

Понимание того, как импортировать из родительского каталога в Python, важно для поддержания организованной кодовой базы.

Эти знания позволяют вам проектировать свои проекты более модульным способом. Это также увеличивает возможность повторного использования вашего кода. Структурируя свой код в отдельные модули и пакеты, вы можете избежать повторения кода и упростить его обслуживание и обновление.

Умение использовать операторы import и from наиболее ценно, когда вы работаете над более крупными проектами, где функциональные возможности распределены по разным каталогам.

Зная, как правильно настроить путь Python для импорта модулей, вы можете получить доступ к функциям, определенным в одном каталоге, работая в другом.

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

С помощью этого краткого руководства вы должны быть хорошо подготовлены к решению любых головоломок импорта, которые Python бросает вам. Но не останавливайтесь на достигнутом. Существует целая вселенная методов и приемов Python, которые ждут своего открытия!


Что такое self в Python: примеры из реального мира

Что такое self в Python: примеры из реального мира

Что такое self в Python: примеры из реального мира

Как сохранить и загрузить файл RDS в R

Как сохранить и загрузить файл RDS в R

Вы узнаете, как сохранять и загружать объекты из файла .rds в R. В этом блоге также рассказывается, как импортировать объекты из R в LuckyTemplates.

Новый взгляд на первые N рабочих дней — решение для языка кодирования DAX

Новый взгляд на первые N рабочих дней — решение для языка кодирования DAX

В этом руководстве по языку программирования DAX вы узнаете, как использовать функцию GENERATE и как динамически изменять название меры.

Продемонстрируйте идеи с помощью метода многопоточных динамических визуализаций в LuckyTemplates

Продемонстрируйте идеи с помощью метода многопоточных динамических визуализаций в LuckyTemplates

В этом учебном пособии рассказывается, как использовать технику многопоточных динамических визуализаций для создания аналитических сведений из динамических визуализаций данных в ваших отчетах.

Введение в фильтрацию контекста в LuckyTemplates

Введение в фильтрацию контекста в LuckyTemplates

В этой статье я пройдусь по контексту фильтра. Контекст фильтра — одна из основных тем, с которой должен ознакомиться любой пользователь LuckyTemplates.

Лучшие советы по использованию приложений в онлайн-службе LuckyTemplates

Лучшие советы по использованию приложений в онлайн-службе LuckyTemplates

Я хочу показать, как онлайн-служба LuckyTemplates Apps может помочь в управлении различными отчетами и аналитическими данными, созданными из различных источников.

Анализ изменений маржи прибыли с течением времени — аналитика с LuckyTemplates и DAX

Анализ изменений маржи прибыли с течением времени — аналитика с LuckyTemplates и DAX

Узнайте, как рассчитать изменения вашей прибыли, используя такие методы, как разветвление показателей и объединение формул DAX в LuckyTemplates.

Идеи материализации кэшей данных в DAX Studio

Идеи материализации кэшей данных в DAX Studio

В этом руководстве будут обсуждаться идеи материализации кэшей данных и то, как они влияют на производительность DAX при предоставлении результатов.

Бизнес-отчетность с использованием LuckyTemplates

Бизнес-отчетность с использованием LuckyTemplates

Если вы все еще используете Excel до сих пор, то сейчас самое подходящее время, чтобы начать использовать LuckyTemplates для своих бизнес-отчетов.

Что такое шлюз LuckyTemplates? Все, что тебе нужно знать

Что такое шлюз LuckyTemplates? Все, что тебе нужно знать

Что такое шлюз LuckyTemplates? Все, что тебе нужно знать