Помилка 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"

Мені це здається дивним, бо

A) в терміналі (ОС 10.10.2), в python, я можу імпортувати модуль без проблем - є відповідний запис у PYTHONPATH в .bashrc

B) у PyCharm - Налаштування - Project cur_proj - Інтерпретатор проекту - CogWheel поруч з інтерпретатором python - більше - показувати шляхи до піктограми вибраного інтерпретатора, з'являються шляхи від PYTHONPATH (як я думаю, що вони повинні)

Отже, чому я отримую помилку, коли намагаюся запустити cool_script.py? - Що я пропускаю?

Примітки:

Додаток 2015-25 лютого

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

Так це працює зараз - але чому ?

Подальші питання виникли:

  • Що таке "коріння змісту" та що таке "коріння джерела"? І чому додавання чогось до PYTHONPATH змушує його якось зламати?
  • чи слід постійно знімати обидві ці параметри (так само у налаштуваннях за замовчуванням не тільки конкретні конфігурації проекту (ліва панель діалогового вікна Запуск / Налагодження конфігурацій)?

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, що спричинило проблеми з імпортом.
Ерік Блюм

Відповіді:


324

Якщо ваш власний модуль знаходиться в тому ж шляху, вам потрібно позначити шлях як Sources Root. У програмі провідника проектів клацніть правою кнопкою миші каталог, який потрібно імпортувати. Потім виберіть Mark Directory Asі виберіть Sources Root.

Я сподіваюся, що це допомагає.


9
Це працювало для мене, але мені також довелося видалити та знову створити конфігурацію запуску, яку я раніше створив, перед тим як позначити папку як корінь джерела.
усміхнувся

2
І потрібно додати, __init__.pyщоб Python ставився до каталогів як до пакунків: stackoverflow.com/questions/448271/…
Beatriz Fonseca,

Як би ви це зробили, якби не використовували піхарму? Я стикаюся з точно такою ж проблемою.
Boudewijn Aasman

@BeatrizFonseca Так. Я не міг змусити його працювати піднесено, але я встановив pycharm і спробував відповідь тут, і він працював чудово, тому він повинен мати щось спільне із зазначенням правильного каталогу як кореневого пакету.
Boudewijn Aasman

@BoudewijnAasman ви можете спробувати використати .перед назвою пакета, щоб вказати, що цей пакунок локальний
Beatriz Fonseca

38

Тож якщо ти підеш

-> Налаштування -> Проект: My_project -> Структура проекту,

Просто каталог, у якому доступний вихідний код, і позначте його як "Джерела" (Ви можете побачити його в тому ж вікні). Каталог із вихідним кодом повинен синіти. Тепер ви можете імпортувати модулі, що знаходяться в одному каталозі.


3
Я розумію, що це старий пост, але він працював для мене завдяки.
Майк - SMT

1
Зустрічав і ігнорував одну і ту ж відповідь багато разів, цього разу спробував і це працює!
А.Аметов

29

PyCharm Community / Professional 2018.2.1

Зараз у мене виникала ця проблема, і я зміг її вирішити подібним чином, як вказували @Beatriz Fonseca та @Julie.

Якщо ви йдете до File -> Settings-> Project: YourProjectName-> Project Structure, у вас буде макет каталогу проекту, над яким ви зараз працюєте. Вам потрібно буде пройти свої каталоги та позначити їх як Sourceкаталог для всіх ваших вихідних файлів або як Resourceпапка для файлів, призначених для імпорту.

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

Я сподіваюся, що ця відповідь комусь допоможе, і, сподіваємось, JetBrains виправить цю надокучливу помилку.


2
Це не характерно для PyCharm Professional , скоріше ця функція доступна і у виданні PyCharm Community . У структурі проекту клацніть правою кнопкою миші каталог, що містить модуль, а потім виберіть Mark Directory asіз контекстного меню та виберіть Sources Root.
Astitva Srivastava

1
Чи можете ви порадити, що означає цей корінь джерела. Хоча це вирішило мою проблему, але не зовсім зрозуміло, чому я це роблю.
користувач3341078

8

Що я спробував - це джерело місця, де є мої файли.

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

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

це працювало для мене.


2
Джерело папки в структурі проекту працювало на мене. Дякую.
Мікрос

Дякуємо @Virendra Patel та @Microos. Мій проект піхарми /home/my_user/git_projects/this_git_project/this_pycharm_project/. Я додав /home/my_user/git_projects/this_git_project/як корінь вмісту і /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
Beatriz Fonseca

3

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

Можливо, якщо PyCharm автоматично додає вибрані коріння джерела, він не використовує повний шлях і, отже, змішує папки з тим самим іменем.


2

Це може бути викликано, коли інтерпретатор Python не може знайти ваш код. Ви повинні прямо вказати Python, щоб знайти свій код у цьому місці.

Робити так:

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

У вашому випадку:

  • Перейдіть на консоль пітона,
  • На початку напишіть такий код:

    import sys
    sys.path.extend([my module URI location])
  • Після написання цього твердження ви можете виконати наступну команду:

    from mymodule import functions

Трохи потворно додати такий шлях, але це працювало для мене.
Флоріан Блюм

це слід робити pycharm, автоматично при відкритті консолі він повинен включати команди sys.path.extend для каталогів, включаючи залежності (інші проекти) та каталоги, що містять вихідний код цього проекту. Але НЕ
РОБИТИ

2

Ключовим заплутаним кроком, який необхідно зробити, є відтворення конфігурації запуску для вихідного файлу, який ви намагаєтеся виконати, щоб IDE вибирав нові шляхи.

Спосіб, який насправді працював для мене, полягав у запуску / редагуванні конфігурацій ..., виберіть конфігурацію для файлу, який ви намагаєтеся запустити ліворуч, зніміть прапорець "Додати коріння джерела до PYTHONPATH", збережіть, а потім поверніться і поставте прапорець і збережіть. ТОГО б це спрацювало.


Дивовижно, це було те, що мені було потрібно, незважаючи на те, що робив Invalidate Cache/Restartдвічі!
Джош Фрідлендер

1

Коріння вмісту - це папки, що містять код вашого проекту, тоді як коріння джерела також визначаються як однакові. Єдиною різницею, яку я зрозумів, було те, що код у вихідних коренях будується перед кодом у корінні вмісту.

Якщо зняти їх, не вплине на час виконання до моменту, коли ви не створите в своєму пакеті окремі модулі, які вручну підключені до Django. Це означає, що будь-який з ваших файлів не містить "з імпорту django ..." або будь-яка функція не викликається через django, якщо зняти прапорці з цих двох параметрів, це призведе до несправності.

Оновлення - проблема виникає лише при використанні Virtual Environmentmanet і лише при керуванні проектом через наданий термінал. Тому що термінал як і раніше працює через систему pyhtonpath за замовчуванням, а не віртуальну env. в той час як панель управління пітона django працює нормально.


1

Вирішення цієї проблеми без позначення каталогів як вихідного корінця полягає в редагуванні конфігурацій запуску та в команді Виконання виберіть опцію "Перенаправити вхід з" та виберіть скрипт, який потрібно запустити. Це працює, тому що він обробляється так, ніби сценарій запускався інтерактивно в цьому каталозі. Однак Python все одно буде позначати назву модуля з помилкою "немає модуля з іменем x":

Перенаправлення вводу з:

Коли інтерпретатор виконує оператор імпорту, він шукає x.py у списку каталогів, зібраних із таких джерел:

  1. Каталог, з якого був запущений сценарій введення, або поточний каталог, якщо інтерпретатор запускається інтерактивно
  2. Список каталогів, що містяться в змінній середовища PYTHONPATH, якщо вона встановлена.
  3. Список каталогів, залежних від встановлення, налаштованих під час встановлення Python, в моєму випадку usr / lib / python3.6 в Ubuntu.

0

Піхарм 2017.1.1

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

Це працювало для мене.


0

ln -s. якийсь проект

Якщо у вас є деякіDirectory / someProjectDir та два файли, файл1.py та file2.py та file1.py намагаються імпортувати за допомогою цього рядка

з файлу імпорту someProjectDir2

Він не працюватиме, навіть якщо ви вказали someProjectDir як вихідний каталог, і навіть якщо він відображається в налаштуваннях, проекті, меню структури проекту як корінь вмісту. Єдиний спосіб це буде - це пов’язати проект, як показано вище (команда unix, працює в mac, не впевнений у використанні чи синтаксисі для Windows). Здається, якийсь механізм, коли Pycharm робить це автоматично або під час оформлення замовлення з контролю версій, або додавання як корінь контексту, оскільки м'яке посилання було створено Pycharm у залежному проекті. Отже, просто копіювати те саме, хоча дивна реплікація каталогу дратує і необхідність викликає здивування. Також у залежності, де створено автоматично, він не відображається як новий каталог під контролем версій. Можливо порівняння файлів .idea виявить більше.


-1

Відповідь, яка працювала для мене, була справді про те, що згадує ОП у своєму оновленні 2015 року: зніміть ці два поля у вашому конфігурації запуску Python:

  • "Додати корені вмісту до PYTHONPATH"
  • "Додати коріння джерела до PYTHONPATH"

У мене вже був налаштований config config для використання належного venv, тому PyCharm виконувати додаткову роботу, щоб додати речі до шляху, не було необхідності. Натомість це викликало помилки.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.