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:
- test.py
- 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?
import sys; sys.path
>>> import test
Odpowiedzi:
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:
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.
źródło
Zmień import w test.py na:
from .hello import hello1
źródło
from . import hello
from . import local_module
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.
źródło
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”
źródło
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łemmy_module
, zadziałało.źródło
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
źródło
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.py
skrypt, możesz zainstalować ten pakiet, w którym się znajdujesz, za pomocąpython3 -m pip install -e .
lubpython3 setup.py install
lubpython3 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 masetup.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.
źródło
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.
źródło