Προσπαθώ να εκτελέσω μια ενότητα από την κονσόλα. Η δομή του καταλόγου μου είναι η εξής:
Προσπαθώ να τρέξω την ενότητα p_03_using_bisection_search.py
, από τον κατάλογο problem_set_02
χρησιμοποιώντας:
$ python3 p_03_using_bisection_search.py
Ο κώδικας μέσα στο p_03_using_bisection_search.py
είναι:
__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()
Εισάγω μια συνάρτηση που βρίσκεται στο αρχείο p_02_paying_debt_off_in_a_year.py
, ο κώδικας της οποίας είναι: p_02_paying_debt_off_in_a_year.py
:
__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()
Λαμβάνω το ακόλουθο σφάλμα: "Η συνάρτηση που χρησιμοποιείται για την εκτέλεση της συνάρτησης είναι η εξής:":
ModuleNotFoundError: No module named '__main__.p_02_paying_debt_off_in_a_year'; '__main__' is not a package
Δεν έχω ιδέα πώς να λύσω αυτό το πρόβλημα. Δοκίμασα να προσθέσω ένα αρχείο __init__.py
, αλλά και πάλι δεν λειτουργεί.
Απλά αφαιρέστε την τελεία για τη σχετική εισαγωγή και κάντε:
from p_02_paying_debt_off_in_a_year import compute_balance_after
Έχω το ίδιο πρόβλημα με εσάς. Νομίζω ότι το πρόβλημα έγκειται στο ότι χρησιμοποιήσατε σχετική εισαγωγή στο in-package import
. Δεν υπάρχει το αρχείο __init__.py
στον κατάλογό σας. Οπότε απλά κάντε import όπως απάντησε ο Moses παραπάνω.
Το βασικό πρόβλημα νομίζω ότι είναι όταν κάνεις import με τελεία:
from .p_02_paying_debt_off_in_a_year import compute_balance_after
Είναι ισοδύναμο με:
from __main__.p_02_paying_debt_off_in_a_year import compute_balance_after
όπου το __main__
αναφέρεται στην τρέχουσα ενότητα p_03_using_bisection_search.py
.
Σύντομα, ο διερμηνέας δεν γνωρίζει την αρχιτεκτονική του καταλόγου σας.
Όταν ο διερμηνέας μπει στο p_03.py
, το σενάριο ισούται με:
from p_03_using_bisection_search.p_02_paying_debt_off_in_a_year import compute_balance_after
και το p_03_using_bisection_search
δεν περιέχει καμία ενότητα ή περίπτωση με όνομα p_02_paying_debt_off_in_a_year
.
Έτσι βρήκα μια πιο καθαρή λύση χωρίς να αλλάξω τα πολύτιμα στοιχεία του περιβάλλοντος της python (αφού έψαξα να βρω πώς τα requests κάνουν σε σχετική εισαγωγή):
Η κύρια αρχιτεκτονική του καταλόγου είναι η εξής:
main.py
setup.py
---`problem_set_02/
------__init__.py
------p01.py
------p02.py
------p03.py
Στη συνέχεια, γράψτε στο αρχείο __init__.py
:
από .p_02_paying_debt_off_in_a_year import compute_balance_after
Εδώ το __main__
είναι το __init__
, αναφέρεται ακριβώς στο module problem_set_02
.
Στη συνέχεια πηγαίνετε στο αρχείο main.py
:
import problem_set_02
Μπορείτε επίσης να γράψετε μια setup.py
για να προσθέσετε τη συγκεκριμένη ενότητα στο περιβάλλον.
Γεια σας Παρακαλώ ακολουθήστε το παρακάτω βήμα, θα επιλύσετε αυτό το πρόβλημα.
Αν έχετε δημιουργήσει κατάλογο και υποκατάλογο, τότε ακολουθήστε τα παρακάτω βήματα και παρακαλώ να έχετε υπόψη σας ότι όλοι οι κατάλογοι πρέπει να έχουν το αρχείο __init__.py
για να αναγνωριστεί ως κατάλογος.
import sys
και εκτελέστε το sys.path
, θα είστε σε θέση να δείτε όλα τα μονοπάτια που αναζητούνται από την python.Πρέπει να είστε σε θέση να δείτε τον τρέχοντα κατάλογο εργασίας σας.
Τώρα εισαγάγετε τον υποκατάλογο και την αντίστοιχη ενότητα που θέλετε να χρησιμοποιήσετε χρησιμοποιώντας import ακολουθήστε αυτή την εντολή: import subdir.subdir.modulename as abc
και τώρα μπορείτε να χρησιμοποιήσετε τις μεθόδους σε αυτό το module.
ScreenShotforSameIssue
όπως μπορείτε να δείτε σε αυτό το στιγμιότυπο οθόνης Έχω ένα γονικό κατάλογο και δύο υποκαταλόγους και κάτω από τον δεύτερο υποκατάλογο έχω module==CommonFunction και βλέπετε δεξιά μετά την εκτέλεση του sys.path μπορώ να δω τον κατάλογο εργασίας μου