Ini adalah pertama kalinya saya benar-benar duduk dan mencoba python 3, dan tampaknya gagal total. Saya memiliki dua file berikut:
- test.py
- config.py
config.py memiliki beberapa fungsi yang didefinisikan di dalamnya serta beberapa variabel. Saya telah menanggalkannya sebagai berikut:
config.py
debug = True
test.py
import config
print (config.debug)
Saya juga punya __init__.py
Namun, saya mendapatkan kesalahan berikut:
ModuleNotFoundError: No module named 'config'
Saya sadar bahwa konvensi py3 adalah menggunakan impor absolut:
from . import config
Namun, ini mengarah pada kesalahan berikut:
ImportError: cannot import name 'config'
Jadi saya bingung apa yang harus dilakukan di sini ... Setiap bantuan sangat dihargai. :)
python
python-3.x
package
python-import
relative-import
blitzmann
sumber
sumber
python test.py
, dan itu berfungsi dengan baik. Saya tidak punya pyCharm, tapi mungkin ada beberapa konfigurasi pyCharm yang menyebabkan masalahJawaban:
TL; DR: Anda tidak dapat melakukan impor relatif dari file yang Anda jalankan sejak itu
__main__
modul bukan bagian dari paket.Impor absolut - impor sesuatu yang tersedia di
sys.path
Impor relatif - mengimpor sesuatu yang relatif ke modul saat ini, harus menjadi bagian dari paket
Jika Anda menjalankan kedua varian dengan cara yang persis sama, salah satunya harus bekerja. Bagaimanapun, berikut adalah contoh yang akan membantu Anda memahami apa yang terjadi, mari tambahkan
main.py
file lain dengan struktur direktori keseluruhan seperti ini:Dan mari kita perbarui test.py untuk melihat apa yang terjadi:
Mari kita jalankan test.py terlebih dahulu:
Berikut "test" adalah yang
__main__
modul dan tidak tahu apa-apa tentang milik sebuah paket. Namunimport config
harus bekerja, karenaryan
folder akan ditambahkan ke sys.path.Mari kita jalankan main.py sebagai gantinya:
Dan di sini tes ada di dalam paket "ryan" dan dapat melakukan impor relatif.
import config
gagal karena impor relatif implisit tidak diizinkan dalam Python 3.Semoga ini bisa membantu.
PS: jika Anda tetap menggunakan Python 3 maka tidak perlu lagi ada
__init__.py
file.sumber
sys.path.append('/some/path/my_module')
bagian dalam/some/path/my_module/__init__.py
?sys.path
selama runtime ( github.com/... ). Anda juga dapat mengatur variabel lingkungan PYTHONPATH.__init__.py
file." Menarik. Bisakah Anda menguraikan ini? Saya mendapat kesan bahwa mekanisme resolusi paket tidak banyak berubah antara 2 dan 3.__init__.py
file." Sebaliknya, dapatkah Anda mendeskripsikan hal-hal jika kami ingin sebuah paket berfungsi dalam 2 dan 3? Dan lihat 2009 yang sudah ketinggalan zaman. Untuk apa__init__.py
? dan jawabannya yang paling tinggi "Ini adalah bagian dari paket" . Kita perlu mulai menekankan perbedaan "paket reguler [lama, pra-3.3]" vs "paket namespace [3.3+]" di mana-mana dan sering.Saya menemukan jawabannya. Sangat frustasi, terutama yang berasal dari python2.
Anda harus menambahkan a
.
ke modul, terlepas dari apakah itu relatif atau absolut.Saya membuat pengaturan direktori sebagai berikut.
modx.py
mody.py
main.py
ketika saya mengeksekusi main, inilah yang terjadi
Saya berlari 2to3, dan output inti adalah ini
Saya harus mengubah pernyataan impor mody.py untuk memperbaikinya
Kemudian saya menjalankan main.py lagi dan mendapatkan output yang diharapkan
Terakhir, hanya untuk membersihkannya dan membuatnya portabel antara 2 dan 3.
sumber
try/except
prosedur pemuatan adalah bahan asli yang bekerja di sini (karena beberapa orang perlu menggunakantry:scripts.modx
danexcept: modx
), dan itulah yang memecahkan masalah ini untuk saya.Pengaturan PYTHONPATH juga dapat membantu masalah ini.
Berikut ini cara melakukannya pada Windows
set PYTHONPATH=.
sumber
Anda harus menambahkan jalur modul ke
PYTHONPATH
.Untuk UNIX (Linux, OSX, ...)
Untuk Windows
sumber
Coba contoh Anda
Ini akan bekerja untuk saya:
Diuji dengan Python: 3.4.2 - PyCharm 2016.3.2
Di samping PyCharm ini menawarkan Anda untuk Mengimpor nama ini .
Anda harus mengklik
config
dan ikon bantuan muncul.sumber
Anda cukup menambahkan file berikut ke direktori tes Anda, dan kemudian python akan menjalankannya sebelum tes
sumber
Set
PYTHONPATH
variabel lingkungan di direktori proyek root.Mempertimbangkan seperti-UNIX:
sumber
Contoh ini berfungsi pada Python 3.6.
Saya sarankan pergi ke
Run -> Edit Configurations
PyCharm, menghapus semua entri di sana, dan mencoba menjalankan kode melalui PyCharm lagi.Jika itu tidak berhasil, periksa penerjemah proyek Anda (Pengaturan -> Project Interpreter) dan jalankan konfigurasi default (Jalankan -> Edit Konfigurasi ...).
sumber
Nyatakan daftar sys.path yang benar sebelum Anda memanggil modul:
sumber
Seperti yang dinyatakan dalam komentar ke posting asli, ini tampaknya menjadi masalah dengan interpreter python yang saya gunakan untuk alasan apa pun, dan bukan sesuatu yang salah dengan skrip python. Saya beralih dari bundel WinPython ke python resmi 3.6 dari python.org dan bekerja dengan baik. terima kasih atas bantuan semuanya :)
sumber
Jika Anda menggunakan python 3+ maka coba tambahkan baris di bawah ini
sumber
Mencoba
Apa yang dilakukan adalah mengimpor dari level folder yang sama. Jika Anda langsung mencoba mengimpornya anggap itu bawahan
sumber