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


99

Мій python якось не може знайти жодного модуля в тому ж каталозі. Що я роблю не так? (python2.7)

Отже, у мене є один каталог '2014_07_13_test', у якому є два файли:

  1. test.py
  2. привіт.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()

Все-таки python дає мені

>>> 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
martineau

@Casy_fill Ви запускаєте програму з каталогу, де знаходяться файли? Для імпортування не має значення, що файли, що імпортують та імпортуються, мають спільний каталог. Важливо, щоб ваш інтерпретатор Python правильно встановив поточний каталог.
Ян Влчинський

Відповіді:


82

З вашим кодом все гаразд, підозрюю, у вас проблема в тому, як ви його запускаєте.

Вам потрібно запустити 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 про відносний імпорт .
HongboZhu

Так, це була моя проблема. У мене була велика папка практичних проектів Python, відкрита у VS Code, і я мав великі проблеми з пошуком речей в тому ж каталозі. Моя проблема полягала в тому, що в терміналі я не змінив каталоги на підкаталог, в якому знаходився мій поточний проект. Як тільки я це зробив, проблема вирішена.
Метт Вест,

105

Змініть імпорт у test.py на:

from .hello import hello1

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 із використанням відносного імпорту було набагато чистішим рішенням.
Russ Schultz,

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

Я наткнувся на це питання. У мене було три папки в одному каталозі, тому мені довелося вказати, яку папку. Приклад: із сценарію імпорту папки


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

Якщо ви впевнені, що всі модулі, файли, які ви намагаєтеся імпортувати, знаходяться в одній папці, і їх слід вибирати безпосередньо, просто вказавши ім'я, а не шлях посилання, тоді ваш редактор або термінал повинен був відкрити головну папку, де всі файли / модулі присутні.

Будь-який, спробуйте запустити з терміналу, переконайтеся, що спочатку ви перейшли у правильний каталог.

компакт-диск path to the root folder where all the modules are

пітон script.py

Або якщо запустити [F5] з редактора, тобто VsCode, відкрийте там повну папку, а не окремі файли.

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