Próbuję uruchomić moduł z konsoli. Struktura mojego katalogu jest następująca:
Próbuję uruchomić moduł p_03_using_bisection_search.py
z problem_set_02
katalogu przy użyciu:
$ python3 p_03_using_bisection_search.py
Kod wewnątrz p_03_using_bisection_search.py
jest:
__author__ = 'm'
from .p_02_paying_debt_off_in_a_year import compute_balance_after
def compute_bounds(balance: float,
annual_interest_rate: float) -> (float, float):
# there is code here, but I have omitted it to save space
pass
def compute_lowest_payment(balance: float,
annual_interest_rate: float) -> float:
# there is code here, but I have omitted it to save space
pass
def main():
balance = eval(input('Enter the initial balance: '))
annual_interest_rate = eval(input('Enter the annual interest rate: '))
lowest_payment = compute_lowest_payment(balance, annual_interest_rate)
print('Lowest Payment: ' + str(lowest_payment))
if __name__ == '__main__':
main()
Importuję funkcję, w p_02_paying_debt_off_in_a_year.py
której znajduje się kod:
__author__ = 'm'
def compute_balance(balance: float,
fixed_payment: float,
annual_interest_rate: float) -> float:
# this is code that has been omitted
pass
def compute_balance_after(balance: float,
fixed_payment: float,
annual_interest_rate: float,
months: int=12) -> float:
# Omitted code
pass
def compute_fixed_monthly_payment(balance: float,
annual_interest_rate: float) -> float:
# omitted code
pass
def main():
balance = eval(input('Enter the initial balance: '))
annual_interest_rate = eval(
input('Enter the annual interest rate as a decimal: '))
lowest_payment = compute_fixed_monthly_payment(balance,
annual_interest_rate)
print('Lowest Payment: ' + str(lowest_payment))
if __name__ == '__main__':
main()
Otrzymuję następujący błąd:
ModuleNotFoundError: No module named '__main__.p_02_paying_debt_off_in_a_year'; '__main__' is not a package
Nie mam pojęcia, jak rozwiązać ten problem. Próbowałem dodać __init__.py
plik, ale nadal nie działa.
python
module
python-3.6
python-import
lmiguelvargasf
źródło
źródło
eval(input...
prawdopodobnie nie jest to świetny pomysł. Po prostu przeanalizuję to, zamiast dać szansę na wykonanie dowolnego kodu.eval(input(...
bit został zasugerowany przez 2to3. Zrobiłem to dzisiaj. Cieszę się, że nie podążam za jego sugestiami, oślepiającymiOdpowiedzi:
Po prostu usuń kropkę dla importu względnego i wykonaj:
źródło
__init__.py
?__init__.py
w tym samym folderze), chociaż moja PyCharm (2018.2.4) oznacza to jako „nierozstrzygnięte odwołanie” i nie może automatycznie uzupełnić importu.from ..sibling_pkg.nephew import my_function
jest ważne dla PyCharm, ale powodujeValueError: attempted relative import beyond top-level package
i MyPyCannot find module named '.sibling_pkg.nephew'
(zanotuj pojedynczy „.” W błędzie, a nie dwa). Jednakfrom sibling_pkg.nephew import my_function
działa zgodnie z przeznaczeniem, nie ma błędu MyPy, ale powoduje błąd PyCharm.Mam taki sam problem jak ty. Myślę, że problem polega na tym, że użyłeś importu względnego
in-package import
. Nie ma__init__.py
w twoim katalogu. Więc po prostu zaimportuj, jak Mojżesz odpowiedział powyżej.Myślę, że podstawowym problemem jest importowanie za pomocą kropki:
Jest to równoważne z:
gdzie
__main__
odnosi się do bieżącego modułup_03_using_bisection_search.py
.W skrócie, interpreter nie zna architektury katalogów.
Kiedy interpreter wchodzi
p_03.py
, skrypt jest równy:i
p_03_using_bisection_search
nie zawiera żadnych wywoływanych modułów ani instancjip_02_paying_debt_off_in_a_year
.Więc wymyśliłem czystsze rozwiązanie bez zmiany cennych elementów środowiska Pythona (po sprawdzeniu, jak żądania działają w przypadku importu względnego):
Główna architektura katalogu to:
main.py
setup.py
---
problem_set_02/
------
__init__.py
------
p01.py
------
p02.py
------
p03.py
Następnie napisz
__init__.py
:Tutaj
__main__
jest__init__
to dokładnie odnosi się do modułuproblem_set_02
.Następnie przejdź do
main.py
:import problem_set_02
Możesz także napisać a,
setup.py
aby dodać określony moduł do środowiska.źródło
Spróbuj uruchomić go jako:
python3 -m p_03_using_bisection_search
źródło
Cześć Wykonaj poniższy krok, rozwiążesz ten problem. Jeśli utworzyłeś katalog i podkatalog, wykonaj poniższe czynności i pamiętaj, że cały katalog musi być
__init__.py
rozpoznany jako katalog.import sys
i uruchomsys.path
, będziesz mógł zobaczyć wszystkie ścieżki, które są wyszukiwane przez python. Musisz być w stanie zobaczyć swój bieżący katalog roboczy.Teraz zaimportuj podkatalog i odpowiedni moduł, którego chcesz użyć za pomocą importu, postępuj zgodnie z następującą komendą:
import subdir.subdir.modulename as abc
teraz możesz korzystać z metod w tym module. ScreenShotforSameIssuejak widać na tym zrzucie ekranu mam jeden katalog nadrzędny i dwa podkatalogi, a pod drugimi podkatalogami mam moduł == CommonFunction i po prawej stronie po wykonaniu sys.path widzę mój katalog roboczy
źródło
Usuń kropkę i zaimportuj absolutny_import na początku pliku
źródło
Wystarczy użyć nazwy głównego folderu, w którym znajduje się plik .py.
źródło