Ошибка PyCharm: «Нет модуля» при попытке импортировать собственный модуль (скрипт Python)

161

Я написал модуль (файл my_mod.pyфайл находится в папке my_module). В настоящее время я работаю в файле, cool_script.pyкоторый находится в папке cur_proj. Я открыл папку в PyCharm, используя File - open (и я предполагаю, следовательно, это проект PyCharm).

В ProjectView (CMD-7) я вижу свой проект cur_proj(красным) и в разделе «Внешние библиотеки» my_module. В cool_script.py я могу написать

from my_module import my_mod as mm

и PyCharm даже делает предложение для my_mod. Все идет нормально.

Тем не менее, когда я пытаюсь запустить cool_script.py, PyCharm сообщает мне «Нет модуля с именем my_module»

Это кажется странным для меня, потому что

А) в терминале (OS 10.10.2), в python, я могу импортировать модуль без проблем - в PYTHONPATH есть соответствующая запись в .bashrc

B) в PyCharm - Настройки - Project cur_proj - Project Interpreter - CogWheel рядом с интерпретатором python - подробнее - показать пути для иконки выбранного переводчика, пути из PYTHONPATH действительно появляются (как я думаю, они должны)

Следовательно, почему я получаю сообщение об ошибке при попытке запустить cool_script.py? - Чего мне не хватает?

Ноты:

Приложение 2015-Фев-25

Когда я захожу в PyCharm для запуска - Редактировать конфигурации, для моего текущего проекта есть две опции, которые выбираются с галочкой: « Добавить корни содержимого в PYTHONPATH » и « Добавить корни источника в PYTHONPATH ». Когда я снял оба флажка, я могу загрузить свой модуль.

Так что это работает сейчас - но почему ?

Возникли дополнительные вопросы:

  • Что такое «корни контента» и что такое «корни источников»? И почему добавление чего-либо к PYTHONPATH делает его каким-то образом ломающимся?
  • я должен снять все эти опции все время (также и в настройках по умолчанию, а не только в конкретных конфигурациях проекта (левая панель диалога Run / Debug Configurations)?
Клаус
источник
2
Возможно, вы уже пробовали это, но при импорте модулей из других пакетов, укажите имя_пакета from foldername.mymodule import mymethod. Еще одна вещь, которую я должен был сделать, это добавить пустую папку _init .py во все папки, которые вы будете использовать для доступа к вашему модулю, так что в случае from parentfolder.childfolder.mymodule ...необходимости вам понадобится init в двух папках. В зависимости от того, где расположены папки относительно друг друга, вам может понадобиться пакет верхнего уровня, sys.pathкак описано в этом ответе
ziddarth
4
У меня тоже была твоя проблема. Следующий пост решил мои проблемы: stackoverflow.com/questions/21236824/…
user3155053
Определили ли вы, почему снятие этих флажков на самом деле работает, а не их проверка?
Nithish Inpursuit Ofhappiness
То, что сработало для меня, это снятие отметки Enable Django Supportв настройках Languages & Frameworks -> Djangoв Pro версии PyCharm. Он открывал консоль django, что вызывало проблемы с импортом.
Эрик Блум

Ответы:

325

Если ваш собственный модуль находится в том же пути, вы должны пометить путь как Sources Root. В проводнике проекта щелкните правой кнопкой мыши каталог, который вы хотите импортировать. Затем выберите Mark Directory Asи выберите Sources Root.

Надеюсь, это поможет.

Беатрис Фонсека
источник
9
Это сработало для меня, но мне также пришлось удалить и заново создать конфигурацию запуска, которую я ранее создал, прежде чем пометить папку как источник root.
Гринч
2
И нужно добавить, __init__.pyчтобы Python рассматривал каталоги как содержащие пакеты: stackoverflow.com/questions/448271/…
Беатрис Фонсека
Как бы вы это сделали, если бы не использовали pycharm? Я сталкиваюсь с точно такой же проблемой.
Будевейн Асман
@BeatrizFonseca Да, я сделал. Я не мог заставить его работать в возвышенном состоянии, но я установил pycharm и попробовал ответ здесь, и он отлично работал, поэтому он должен как-то иметь отношение к указанию правильного каталога в качестве корневого пакета.
Будевейн Асман
@BoudewijnAasman, вы можете попробовать использовать .перед именем пакета, чтобы указать, что этот пакет является локальным
Беатрис Фонсека
38

Так что если вы идете в

-> Настройка -> Проект: My_project -> Структура проекта,

Просто каталог, в котором доступен исходный код, и пометьте его как «Источники» (вы можете увидеть его в том же окне). Каталог с исходным кодом должен стать синим. Теперь вы можете импортировать модули, находящиеся в одном каталоге.

JRD
источник
3
Я понимаю, что это старый пост, но он сработал для меня, спасибо.
Майк - SMT
1
Обнаружил и проигнорировал один и тот же ответ много раз, на этот раз попробовал, и это работает!
А.Аметов
29

Сообщество PyCharm / Professional 2018.2.1

У меня была эта проблема только сейчас, и я смог решить ее таким же образом, как указали @Beatriz Fonseca и @Julie.

Если вы перейдете на File-> Settings-> Project: YourProjectName-> Project Structure, у вас будет макет каталога проекта, в котором вы сейчас работаете. Вам нужно будет просмотреть ваши каталоги и пометить их как Sourceкаталог для всех ваших исходных файлов. или как Resourceпапка для файлов, предназначенных исключительно для импорта.

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

Я надеюсь, что этот ответ кому-то поможет, и, надеюсь, JetBrains исправит эту досадную ошибку.

Олег Силкин
источник
2
Это не относится к PyCharm Professional , скорее эта функция доступна и в PyCharm Community Edition. В структуре проекта щелкните правой кнопкой мыши каталог, содержащий модуль, затем выберите Mark Directory asв контекстном меню и выберите Sources Root.
Аститва Шривастава
1
Подскажите, пожалуйста, что означает этот корень источников. Хотя это решило мою проблему, но я не совсем понял, почему я это делаю.
user3341078
8

Я попытался найти место, где находятся мои файлы.

например E:\git_projects\My_project\__init__.py is my location.

Я пошел в Файл -> Настройка -> Проект: My_project -> Структура проекта и добавил корень контента в место упоминания. E:\git_projects\My_project

это сработало для меня.

Вирандра Патель
источник
2
Исходная папка в структуре проекта работала у меня. Спасибо.
Microos
Спасибо @Virendra Patel и @Microos. Мой проект Pycharm в /home/my_user/git_projects/this_git_project/this_pycharm_project/. Я добавил в /home/my_user/git_projects/this_git_project/качестве содержимого root и /home/my_user/git_projects/this_git_project/this_pycharm_project/в качестве единственной исходной папки, и все окончательно сработало.
KLaz
3

my_moduleэто папка, а не модуль, и вы не можете импортировать папку, попробуйте перейти my_mod.pyв ту же папку, что cool_script.pyи затем, и сделайте import my_mod as mm. Это потому, что python смотрит только в текущем каталоге и sys.path, и поэтому не будет искать, my_mod.pyесли он не находится в том же каталоге

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

Что касается других ваших вопросов, я не знаю, так как я не использую PyCharm.

Том
источник
Вы можете создать init .py в папке, интерпретатор python будет читать как пакет python: mikegrouchy.com/blog/2012/05/be-pythonic-__init__py.html
Беатрис Фонсека
3

Я также получал сообщение об ошибке «Добавить корни источника в PYTHONPATH». Моя проблема заключалась в том , что у меня было две папки с таким же именем, как project/subproject1/thing/srcи project/subproject2/thing/srcя оба из них помечен как корень источника. Когда я переименовал одну из "thing"папок в "thing1"(любое уникальное имя), она работала.

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

RubberDuckRabbit
источник
2

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

Для этого:

  • Перейти к вашей консоли Python
  • Добавьте sys.path.extend(['your module location'])в консоль Python.

В твоем случае:

  • Перейдите к своей консоли Python,
  • В начале напишите следующий код:

    import sys
    sys.path.extend([my module URI location])
  • Как только вы написали это утверждение, вы можете выполнить следующую команду:

    from mymodule import functions
Шраван Шетти
источник
Немного некрасиво добавить такой путь, но у меня это сработало.
Флориан Блюм
это должно быть сделано pycharm, автоматически при открытии консоли он должен включать команды sys.path.extend для каталогов, включая зависимости (другие проекты), и каталогов, содержащих исходный код данного проекта. НО ЭТО НЕ делает это автоматически
fabiob
2

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

У меня действительно получилось так, чтобы перейти в меню «Выполнить / редактировать конфигурации», выбрать конфигурацию для файла, который вы пытаетесь запустить с левой стороны, снять флажок «Добавить исходные корни в PYTHONPATH», сохранить, а затем вернитесь и установите флажок и сохраните. Тогда это будет работать.

tomchappell
источник
Удивительно, но это было то, что мне было нужно, несмотря на то, что я делал это Invalidate Cache/Restartдважды!
Джош Фридлендер
1

Корни содержимого - это папки, содержащие код вашего проекта, в то время как исходные корни также определены как одинаковые. Единственное отличие, которое я понял, заключалось в том, что код в корнях исходного кода создается перед кодом в корне содержимого.

Отключение их не повлияет на время выполнения до тех пор, пока вы не создадите в своем пакете отдельные модули, которые вручную подключены к Django. Это означает, что если какие-либо из ваших файлов не содержат 'from django import ...' или какая-либо функция не вызывается через django, снятие отметки с этих двух параметров приведет к сбоям.

Обновление - проблема возникает только при использовании Virtual Environmanet и только при управлении проектом через предоставленный терминал. Потому что терминал все еще работает через системный pyhtonpath по умолчанию, а не через виртуальную среду. в то время как панель управления Python Django работает нормально.

RA123
источник
1

Решение этой проблемы без необходимости помечать каталог как исходный корень состоит в том, чтобы отредактировать конфигурации запуска и в разделе «Выполнение» выбрать параметр «Перенаправить ввод из» и выбрать сценарий, который вы хотите запустить. Это работает, потому что тогда он обрабатывается, как если бы скрипт был запущен в интерактивном режиме в этом каталоге. Однако Python по-прежнему помечает имя модуля с ошибкой «нет модуля с именем x»:

Перенаправить ввод с:

Когда интерпретатор выполняет инструкцию import, он ищет x.py в списке каталогов, собранных из следующих источников:

  1. Каталог, из которого был запущен входной скрипт, или текущий каталог, если интерпретатор запускается в интерактивном режиме
  2. Список каталогов, содержащихся в переменной окружения PYTHONPATH, если он установлен.
  3. Зависящий от установки список каталогов, настроенных во время установки Python, в моем случае это usr / lib / python3.6 в Ubuntu.
PyFox
источник
0

Pycharm 2017.1.1

  1. Нажмите на View->ToolBar&View->Tool Buttons
  2. На левой панели Projectбудет видно, щелкните правой кнопкой мыши на нем и нажмите, Autoscroll to source а затем запустите свой код.

Это сработало для меня.

AB Abhi
источник
0

Ин-с. someProject

Если у вас есть someDirectory / someProjectDir и два файла, file1.py и file2.py, и file1.py пытается импортировать с этой строкой

из someProjectDir импортировать файл2

Он не будет работать, даже если вы определили someProjectDir в качестве исходного каталога, и даже если он отображается в настройках, проекте, меню структуры проекта в качестве корня контента. Единственный способ, которым он будет работать, - это связать проект, как показано выше (команда unix, работает на Mac, не уверен в использовании или синтаксисе для Windows). Кажется, существует механизм, в котором Pycharm делает это автоматически либо при извлечении из контроля версий, либо при добавлении в качестве корневого контекста, поскольку программная ссылка была создана Pycharm в зависимом проекте. Следовательно, просто копирование того же самого, хотя странная репликация каталога раздражает, и необходимость вызывает недоумение. Также в зависимости, где автоматически создается, он не отображается как новый каталог под управлением версиями. Возможно, сравнение файлов .idea покажет больше.

user10895922
источник
-1

Ответ, который работал для меня, был, действительно, то, что OP упоминает в своем обновлении 2015 года: снимите эти два флажка в вашей конфигурации запуска Python:

  • «Добавить корни контента в PYTHONPATH»
  • «Добавить исходные корни в PYTHONPATH»

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

bsberry
источник