Python nie może znaleźć modułu w tym samym folderze


103

Mój Python nie może znaleźć żadnych modułów w tym samym katalogu. Co ja robię źle? (python2.7)

Mam więc jeden katalog „2014_07_13_test”, w którym znajdują się dwa pliki:

  1. test.py
  2. hello.py

gdzie hello.py:

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

def hello1():
    print 'HelloWorld!'

i test.py:

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

from hello import hello1

hello1()

Wciąż daje mi Python

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

Co jest nie tak?


2
Jak wykonujesz skrypt? Również co jest wynikiemimport sys; sys.path
Salem,

1
Spróbuj>>> import test
martineau

@Casy_fill Czy uruchamiasz swój program z katalogu, w którym znajdują się pliki? W przypadku importowania nie ma znaczenia, że ​​pliki importu i importu współdzielą katalog. Ważne jest, aby Twój interpreter Pythona miał poprawnie ustawiony bieżący katalog.
Jan Vlcinsky

Odpowiedzi:


85

Twój kod jest w porządku, podejrzewam, że problem polega na tym, jak go uruchamiasz.

Musisz uruchomić Pythona z katalogu „2014_07_13_test”.

Otwórz wiersz poleceń i „cd” w katalogu „2014_07_13_test”.

Na przykład:

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

Jeśli nie możesz 'cd' do katalogu takiego jak ten, możesz dodać go do sys.path

W test.py:

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

Lub ustaw / edytuj PYTHONPATH

I wszystko powinno być dobrze ...

... cóż, jest mały błąd w twoich liniach „shebang” (pierwsza linia w obu twoich plikach), nie powinno być spacji między znakami „#” i „!”

Jest lepszy shebang, którego powinieneś użyć.

Ponadto nie potrzebujesz linii shebang na każdym pliku ... tylko te, które zamierzasz uruchamiać z powłoki jako pliki wykonywalne.


wielkie dzięki, że problem! Niestety, SublimeRepl (którego używam) nie obsługuje teraz uruchamiania Pythona z folderu, więc wygląda na to, że muszę teraz wyeksportować PATH
Philipp_Kats

Później czytelnicy prosimy o przeczytanie do końca strony, aby zobaczyć inne bardzo przydatne odpowiedzi, np. Ta z jfn na temat względnego importu .
HongboZhu

Tak, to był mój problem. Miałem duży folder projektów ćwiczeń Pythona otwarty w VS Code i miałem duże problemy ze znalezieniem rzeczy w tym samym katalogu. Mój problem polegał na tym, że w terminalu nie zmieniłem katalogów na podkatalog, w którym miałem obecny projekt. Kiedy to zrobiłem, problem został rozwiązany.
Matt West,

109

Zmień import w test.py na:

from .hello import hello1

24
Jeśli ktoś inny znajdzie to później, nazywa się to importami względnymi i zostało dodane w Pythonie 2.5: docs.python.org/2.5/whatsnew/pep-328.html
sgfit

10
Aby zaimportować cały moduł użyjfrom . import hello
ST7

Myślę, że to lepsze rozwiązanie niż najlepsza akceptowana odpowiedź. Używam całego importu modułu, jak wskazał ST7:from . import local_module
Gene M

27

Miałem podobny problem, rozwiązałem go poprzez jawne dodanie katalogu pliku do listy ścieżek:

import os
import sys

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

Po tym nie miałem problemu z importowaniem z tego samego katalogu.


2
Chociaż to zadziałało, odpowiedź z jwn przy użyciu importu względnego była znacznie czystszym rozwiązaniem.
Russ Schultz

19

Oto ogólne rozwiązanie, którego używam. Rozwiązuje problem importowania z modułów w tym samym folderze:

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

Umieść to na górze modułu, który powoduje wyświetlenie błędu „Brak modułu o nazwie xxxx”


1
Pomogło mi to załadować moduł z katalogu nadrzędnego, zastępując „..” przez „../ ..”. Wielkie dzięki!
Nikola R.

1
jest plik nazwa pliku, który ma być importowany lub modułu bieżącego gdzie importujemy moduł lub jest stała
Manoj

12

W moim przypadku Python nie mógł go znaleźć, ponieważ umieściłbym kod wewnątrz modułu z łącznikami, np my-module. Kiedy to zmieniłem my_module, zadziałało.


1

Natknąłem się na ten problem. Miałem trzy foldery w tym samym katalogu, więc musiałem określić, który folder. Np .: ze skryptu importu folderów


0

Poniższe informacje nie rozwiązują problemu OP, ale tytuł i błąd są dokładnie tym, z czym się spotkałem.

Jeśli twój projekt zawiera setup.pyskrypt, możesz zainstalować ten pakiet, w którym się znajdujesz, za pomocą python3 -m pip install -e .lub python3 setup.py installlub python3 setup.py develop, a ten pakiet zostanie zainstalowany, ale nadal będzie można go edytować (więc zmiany w kodzie będą widoczne podczas importowania pakietu). Jeśli nie ma setup.py, nadaj mu sens .

Zresztą problem, z którym boryka się OP, wydaje się już nie istnieć?

plik one.py:

def function():
    print("output")

plik 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

Inne rozwiązania wydają się `` brudne ''

W przypadku OP z 2 plikami testowymi modyfikacja ich do działania prawdopodobnie jest w porządku. Jednak w innych rzeczywistych scenariuszach metody wymienione w innych odpowiedziach prawdopodobnie nie są zalecane. Wymagają one zmodyfikowania kodu Pythona lub ograniczenia elastyczności (uruchamianie pliku Pythona z określonego katalogu) i ogólnie wprowadzają uciążliwości. A co, jeśli właśnie sklonowałeś projekt i tak się stanie? Prawdopodobnie już działa dla innych osób, a wprowadzanie zmian w kodzie nie jest konieczne. Wybrana odpowiedź wymaga również, aby ludzie uruchomili skrypt z określonego folderu, aby działał. Może to być źródłem długotrwałej irytacji, która nigdy nie jest dobra. Sugeruje również dodanie określonego folderu Pythona do PATH (można to zrobić za pomocą Pythona lub wiersza poleceń). Ponownie, co się stanie, jeśli zmienisz nazwę lub przeniesiesz folder w ciągu kilku miesięcy? Musisz ponownie wytropić tę stronę, i ostatecznie odkryjesz, że musisz ustawić ścieżkę (i że zrobiłeś to dokładnie kilka miesięcy temu), i że musisz po prostu zaktualizować ścieżkę (na pewno możesz użyć sys.path i ustawić ją programowo, ale to może być nadal niestabilne ). Wiele źródeł irytacji.


0

Jeśli jesteś pewien, że wszystkie moduły, pliki, które próbujesz zaimportować, znajdują się w tym samym folderze i powinny być wybierane bezpośrednio, podając nazwę, a nie ścieżkę odniesienia, wtedy twój edytor lub terminal powinien otworzyć główny folder, w którym wszystko pliki / moduły są obecne.

Albo spróbuj uruchomić z terminala, upewnij się, że najpierw przejdziesz do właściwego katalogu.

Płyta CD path to the root folder where all the modules are

pyton script.py

Lub jeśli uruchamiasz [F5] z edytora, np. VsCode, otwórz tam cały folder, a nie poszczególne pliki.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.