Saya mencoba menjalankan modul dari konsol. Struktur direktori saya adalah ini:
Saya mencoba menjalankan modul p_03_using_bisection_search.py
, dari problem_set_02
direktori menggunakan:
$ python3 p_03_using_bisection_search.py
Kode di dalamnya p_03_using_bisection_search.py
adalah:
__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()
Saya mengimpor fungsi yang memiliki p_02_paying_debt_off_in_a_year.py
kode:
__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()
Saya mendapatkan kesalahan berikut:
ModuleNotFoundError: No module named '__main__.p_02_paying_debt_off_in_a_year'; '__main__' is not a package
Saya tidak tahu bagaimana menyelesaikan masalah ini. Saya sudah mencoba menambahkan __init__.py
file, tetapi masih belum berfungsi.
python
module
python-3.6
python-import
lmiguelvargasf
sumber
sumber
eval(input...
mungkin bukan ide yang bagus. Saya hanya menguraikannya alih-alih membuka peluang untuk eksekusi kode arbitrer.eval(input(...
bit disarankan oleh 2to3. Saya telah melakukannya untuk saya hari ini. senang saya tidak mengikuti saran itu blindlingJawaban:
Cukup hapus titik untuk impor relatif dan lakukan:
sumber
__init__.py
?__init__.py
di folder yang sama), meskipun PyCharm saya (2018.2.4) menandai ini sebagai "referensi yang belum terselesaikan" dan gagal melengkapi impor secara otomatis.from ..sibling_pkg.nephew import my_function
berlaku untuk PyCharm, tetapi menghasilkanValueError: attempted relative import beyond top-level package
dan MyPyCannot find module named '.sibling_pkg.nephew'
(catat satu "." Dalam kesalahan, bukan dua). Namun,from sibling_pkg.nephew import my_function
berfungsi sebagaimana dimaksud, tidak memiliki kesalahan MyPy, tetapi menghasilkan kesalahan PyCharm.Saya memiliki masalah yang sama seperti Anda. Saya pikir masalahnya adalah Anda menggunakan impor relatif
in-package import
. Tidak ada__init__.py
di direktori Anda. Jadi impor saja seperti yang dijawab Musa di atas.Masalah inti yang saya pikir adalah ketika Anda mengimpor dengan sebuah titik:
Itu sama dengan:
di mana
__main__
mengacu pada modul Anda saat inip_03_using_bisection_search.py
.Secara singkat, penerjemah tidak tahu arsitektur direktori Anda.
Ketika penerjemah masuk
p_03.py
, skrip sama dengan:dan
p_03_using_bisection_search
tidak mengandung modul atau instance yang dipanggilp_02_paying_debt_off_in_a_year
.Jadi saya datang dengan solusi bersih tanpa mengubah barang berharga lingkungan python (setelah mencari bagaimana permintaan dilakukan dalam impor relatif):
Arsitektur utama direktori adalah:
main.py
setup.py
---
problem_set_02/
------
__init__.py
------
p01.py
------
p02.py
------
p03.py
Kemudian tulis
__init__.py
:Ini
__main__
dia__init__
, tepatnya mengacu pada modulproblem_set_02
.Lalu pergi ke
main.py
:import problem_set_02
Anda juga dapat menulis a
setup.py
untuk menambahkan modul khusus ke lingkungan.sumber
Coba jalankan sebagai:
python3 -m p_03_using_bisection_search
sumber
Jika Anda telah membuat direktori dan sub-direktori, ikuti langkah-langkah di bawah ini dan harap diingat bahwa semua direktori harus
__init__.py
membuatnya dikenal sebagai direktori.Dalam skrip Anda, sertakan
import sys
dansys.path
, Anda akan dapat melihat semua jalur yang tersedia untuk Python. Anda harus dapat melihat direktori kerja Anda saat ini.Sekarang impor sub-direktori dan modul masing-masing yang ingin Anda gunakan menggunakan:
import subdir.subdir.modulename as abc
dan sekarang Anda dapat menggunakan metode dalam modul itu.Sebagai contoh, Anda dapat melihat di screenshot ini saya memiliki satu direktori induk dan dua sub-direktori dan di bawah sub-direktori kedua saya memiliki modul
CommonFunction
. Di sebelah kanan konsol saya menunjukkan bahwa setelah eksekusisys.path
, saya dapat melihat direktori kerja saya.sumber
Hapus titik dan impor absolute_import di awal file Anda
sumber
Cukup gunakan nama folder utama tempat file .py berada.
sumber