Невозможно импортировать модуль из исходного каталога в pycharm

Этот вопрос задавался раньше, но я не мог решить его ни с одним из ответов. Я открыл папку проекта в pycharm (Примечание, что папка проекта не находится в каталоге ../PycharmProject/....

Моя структура очень проста:

project_title (folder)
             |--src (folder)
                  |-- app.py  
                  |-- pipeline_tools (folder)
                     |-- helpers.py
                     |-- other modules

Я пробовал все возможные решения и комбинации, но когда в app.py я пытаюсь импортировать функцию из любого модуля в tools, я получаю ошибки.

Кроме того, Pycharm подчеркивает красным цветом следующее утверждение:

1) from pipeline_tools.helpers import a_certain_function (красное подчеркивание с надписью «Неразрешенная ссылка»)

Но следующее не дает мне красного:

2) from .pipeline_tools.helpers import a_certain_function (без красного подчеркивания, обратите внимание на относительный импорт)

Тот факт, что у меня есть или нет __init__.py внутри модулей, ничего не меняет - я все еще получаю следующие две ошибки:

Для 1)

Traceback (most recent call last):
  File "<input>", line 1, in <module>
  File "/home/gabriele/pycharm-2019.1.1/helpers/pydev/_pydev_bundle/pydev_import_hook.py", line 21, in do_import
    module = self._system_import(name, *args, **kwargs)
ModuleNotFoundError: No module named 'pipeline_tools'

для 2)

Traceback (most recent call last):
  File "<input>", line 1, in <module>
  File "/home/gabriele/pycharm-2019.1.1/helpers/pydev/_pydev_bundle/pydev_import_hook.py", line 21, in do_import
    module = self._system_import(name, *args, **kwargs)
ModuleNotFoundError: No module named '__main__.pipeline_tools'; '__main__' is not a package

Вещи, которые я убедился, что пробовал:

1) Перейдите к settings > Project Structure проверьте content root есть ли .../project_title и пометьте его как "источник" - он синий.

2) Добавляем __init__.py в папку pipeline_tools и в папку /src, перепробовали все возможные комбинации.

3) Используйте приведенный ниже код, чтобы проверить, что путь к папке проекта является частью строки пути — это в конце

import sys
print(sys.path)

4) Используйте приведенный ниже код, чтобы переместить путь проекта в начало sys.path: sys.path.insert(0,'path/to/project_title')

5) Только что попробовал напечатать PYTHONPATH вот так:

os.environ['PYTHONPATH'].split(os.pathsep)

и каталог моего проекта не находится в нем

Я сейчас немного в растерянности. Понятия не имею, что происходит.

3 метода стилизации элементов HTML
3 метода стилизации элементов HTML
Когда дело доходит до применения какого-либо стиля к нашему HTML, существует три подхода: встроенный, внутренний и внешний. Предпочтительным обычно...
Формы c голосовым вводом в React с помощью Speechly
Формы c голосовым вводом в React с помощью Speechly
Пытались ли вы когда-нибудь заполнить веб-форму в области электронной коммерции, которая требует много кликов и выбора? Вас попросят заполнить дату,...
Стилизация и валидация html-формы без использования JavaScript (только HTML/CSS)
Стилизация и валидация html-формы без использования JavaScript (только HTML/CSS)
Будучи разработчиком веб-приложений, легко впасть в заблуждение, считая, что приложение без JavaScript не имеет права на жизнь. Нам становится удобно...
Flatpickr: простой модуль календаря для вашего приложения на React
Flatpickr: простой модуль календаря для вашего приложения на React
Если вы ищете пакет для быстрой интеграции календаря с выбором даты в ваше приложения, то библиотека Flatpickr отлично справится с этой задачей....
В чем разница между Promise и Observable?
В чем разница между Promise и Observable?
Разберитесь в этом вопросе, и вы значительно повысите уровень своей компетенции.
Что такое cURL в PHP? Встроенные функции и пример GET запроса
Что такое cURL в PHP? Встроенные функции и пример GET запроса
Клиент для URL-адресов, cURL, позволяет взаимодействовать с множеством различных серверов по множеству различных протоколов с синтаксисом URL.
4
0
2 244
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

По какой-то чертовой причине я не понимаю, что установка каталога src в качестве источника sources root вместо каталога project_title (который все равно содержит его ... но откуда я знаю) сработала.

Итак, решение было:

-> настройки -> структура проекта -> удалить предыдущий корневой путь к контенту и сделать источником контента каталог src

импортировать так:

from pipeline_tools.helpers import func_1, func_2

Примечание:, что у меня не делайте есть файл __init__.py в моей папке, так как я читал, что они больше не нужны.

Prior to Python 3.3, filesystem directories, and directories within zipfiles, had to contain an init.py in order to be recognised as Python package directories. Even if there is no initialisation code to run when the package is imported, an empty init.py file is still needed for the interpreter to find any modules or subpackages in that directory.

This has changed in Python 3.3: now any directory on sys.path with a name that matches the package name being looked for will be recognised as contributing modules and subpackages to that package.

От Заметки Ника Коглана по Python

Если project_title был вашим источником, ваш импорт должен выглядеть так: from src.pipeline_tools.helpers import myfunction. Когда вы пишете свой импорт как from pipeline_tools...., вы неявно предполагаете, что корнем ваших источников является src, поэтому, когда вы определяете src как таковое, это работает. Один из быстрых способов настроить это — щелкнуть правой кнопкой мыши папку, которую вы хотите сделать корневой, и нажать Mark directory as -> Sources root. Затем каталог должен появиться в дереве синего цвета.

Eskapp 22.05.2019 15:05

Большое спасибо за это объяснение! «Когда вы пишете свой импорт как из pipe_tools .... вы неявно предполагаете, что корнем ваших источников является src». Означает ли это, что с project_title в качестве источников я мог бы просто написать from helpers import func?

Tytire Recubans 22.05.2019 15:20

Нет, вам нужно указать путь от выбранного вами корня. Так что, если это верхняя папка, вам нужно будет написать from src.pipeline_tools.helpers import func. Тем не менее, я предлагаю вам выбрать src для корня источников, так как это кажется более естественным, учитывая то, как выглядит дерево.

Eskapp 22.05.2019 15:23

Другие вопросы по теме