Python не может найти модуль в той же папке

98

Мой питон почему-то не может найти никаких модулей в том же каталоге. Что я делаю не так? (python2.7)

Итак, у меня есть один каталог 2014_07_13_test с двумя файлами в нем:

  1. test.py
  2. hello.py

где hello.py:

# !/usr/local/bin/python
# -*- coding: utf-8 -*-

def hello1():
    print 'HelloWorld!'

и test.py:

# !/usr/local/bin/python
# -*- coding: utf-8 -*-

from hello import hello1

hello1()

Тем не менее питон дает мне

>>> Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "<string>", line 4, in <module>
ImportError: No module named hello

Что не так?

Филипп_Кац
источник
2
Как вы выполняете сценарий? Также каков результатimport sys; sys.path
Салем
1
Попробуйте>>> import test
Мартино
@Casy_fill Вы запускаете свою программу из каталога, в котором находятся файлы? Для импорта не имеет значения, что импортируемые и импортированные файлы имеют общий каталог. Важно, чтобы ваш интерпретатор Python правильно установил текущий каталог.
Jan Vlcinsky

Ответы:

81

Ваш код в порядке, я подозреваю, что ваша проблема в том, как вы его запускаете.

Вам нужно запустить python из каталога 2014_07_13_test.

Откройте командную строку и нажмите cd в каталог 2014_07_13_test.

Например:

$ cd /path/to/2014_07_13_test
$ python test.py

Если вы не можете 'cd' в такой каталог, вы можете добавить его в sys.path

В test.py:

import sys, os
sys.path.append('/path/to/2014_07_13_test')

Или установите / отредактируйте PYTHONPATH

И все должно быть хорошо ...

... ну, есть небольшая ошибка с вашими строками 'shebang' (первая строка в обоих ваших файлах), не должно быть пробелов между '#' и '!'

Существует лучше притон вы должны использовать.

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

Джереми Аллен
источник
Большое спасибо, что проблема! К сожалению, SublimeRepl (который я использую) прямо сейчас не поддерживает запуск python из папки, поэтому, похоже, мне нужно экспортировать PATH сейчас
Philipp_Kats
Более поздние читатели, пожалуйста, прочтите до конца страницы, чтобы увидеть другие очень полезные ответы, например, ответ от jfn об относительном импорте .
ХунбоЧжу,
Ага, это была моя проблема. У меня была большая папка с практическими проектами Python, открытая в VS Code, и у меня были большие проблемы с поиском вещей в том же каталоге. Моя проблема заключалась в том, что в терминале я не изменил каталоги на подкаталог, в котором был мой текущий проект. Как только я это сделал, проблема была решена.
Мэтт Уэст,
105

Измените свой импорт в test.py на:

from .hello import hello1
JFN
источник
23
Если кто-то еще обнаружит это позже, это называется относительным импортом и было добавлено в python 2.5: docs.python.org/2.5/whatsnew/pep-328.html
sgfit
9
Для импорта всего модуля используйтеfrom . import hello
ST7
Я думаю, что это лучшее решение, чем наиболее принятый ответ. Я использую весь импорт модуля, как указал ST7:from . import local_module
Gene M
25

У меня была аналогичная проблема, я решил ее, явно добавив каталог файла в список путей:

import os
import sys

file_dir = os.path.dirname(__file__)
sys.path.append(file_dir)

После этого у меня не было проблем с импортом из того же каталога.

экотнер
источник
2
Хотя это сработало, ответ от jwn с использованием относительного импорта был гораздо более чистым решением.
Расс Шульц
16

Вот общее решение, которое я использую. Решает проблему импорта из модулей в той же папке:

import os.path
import sys
sys.path.append(os.path.join(os.path.dirname(__file__), '..'))

Поместите это вверху модуля, который выдает ошибку «Нет модуля с именем xxxx».

ападана
источник
1
Это помогло мне загрузить модуль из родительского каталога, заменив ".." на "../ ..". Большое спасибо!
Nikola R.
1
это файл имя файла , который будет импортироваться или текущего модулем , где мы импортируем модуль или постоянно
Манодж
9

В моем случае Python не смог его найти, потому что я поместил код внутри модуля с дефисами, например my-module. Когда я поменял на my_moduleэто работало.

Крис Клэкстон
источник
1

Я столкнулся с этой проблемой. У меня было три папки в одном каталоге, поэтому мне пришлось указать, в какой папке. Пример: из скрипта импорта папки

Nippon87
источник
0

Следующее не решает проблему OP, но заголовок и ошибка - это именно то, с чем я столкнулся.

Если в вашем проекте есть setup.pyсценарий, вы можете установить этот пакет, в котором вы находитесь, с помощью python3 -m pip install -e .или python3 setup.py installили python3 setup.py develop, и этот пакет будет установлен, но по-прежнему доступен для редактирования (поэтому изменения в коде будут видны при импорте пакета). Если у него нет setup.py, разберитесь в этом .

В любом случае, проблема, с которой сталкивается OP, похоже, больше не существует?

файл one.py:

def function():
    print("output")

файл two.py:

#!/usr/bin/env python3

import one
one.function()
chmod +x two.py # To allow execution of the python file
./two.py # Only works if you have a python shebang

Command line output: output

Другие решения кажутся «грязными»

В случае OP с 2 тестовыми файлами их изменение для работы, вероятно, нормально. Однако в других реальных сценариях методы, перечисленные в других ответах, вероятно, не рекомендуются. Они требуют, чтобы вы изменили код python или ограничили вашу гибкость (запуск файла python из определенного каталога) и, как правило, вызывают раздражение. Что делать, если вы только что клонировали проект, и это произойдет? Вероятно, это уже работает для других, и вносить изменения в код не нужно. Выбранный ответ также требует, чтобы люди запускали сценарий из определенной папки, чтобы он заработал. Это может стать источником длительного раздражения, а это никогда не бывает хорошо. Он также предлагает добавить вашу конкретную папку python в PATH (можно сделать через python или командную строку). Опять же, что произойдет, если вы переименуете или переместите папку через несколько месяцев? Вы должны снова выследить эту страницу, и в конце концов обнаружите, что вам нужно установить путь (и что вы сделали именно это несколько месяцев назад), и что вам просто нужно обновить путь (конечно, вы можете использовать sys.path и программно установить его, но это все еще может быть нестабильным ). Множество источников сильного раздражения.

Бен Баттерворт
источник
0

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

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

CD path to the root folder where all the modules are

питон script.py

Или, если вы запускаете [F5] из редактора, то есть VsCode, откройте там всю папку, а не отдельные файлы.

Икра.
источник