Kesalahan PyCharm: 'No Module' saat mencoba mengimpor modul sendiri (skrip python)

160

Saya telah menulis modul (file my_mod.pyfile yang berada di folder my_module). Saat ini, saya bekerja di file cool_script.pyyang berada di folder cur_proj. Saya telah membuka folder di PyCharm menggunakan File - open (dan saya berasumsi, karenanya, ini adalah proyek PyCharm).

Di ProjectView (CMD-7), saya bisa melihat proyek saya cur_proj(merah) dan di bawah "Pustaka Eksternal" saya melihat my_module. Di cool_script.py, saya bisa menulis

from my_module import my_mod as mm

dan PyCharm bahkan membuat saran untuk my_mod. Sejauh ini baik.

Namun, ketika saya mencoba menjalankan cool_script.py, PyCharm memberi tahu saya "Tidak ada modul bernama my_module"

Ini sepertinya aneh bagiku, karena

A) di terminal (OS 10.10.2), dengan python, saya dapat mengimpor modul tanpa masalah - ada entri yang sesuai di PYTHONPATH di .bashrc

B) di PyCharm - Pengaturan - Proyek cur_proj - Project Interpreter - CogWheel di sebelah python interpreter - more - menunjukkan jalur untuk ikon juru bahasa yang dipilih, jalur dari PYTHONPATH muncul (seperti yang saya pikir seharusnya).

Karenanya, mengapa saya mendapatkan kesalahan saat mencoba menjalankan cool_script.py? - Apa yang saya lewatkan?

Catatan:

Addendum 2015-Feb-25

Ketika saya masuk ke PyCharm untuk Menjalankan - Edit Konfigurasi, untuk proyek saya saat ini, ada dua opsi yang dipilih dengan tanda centang: " Tambahkan akar konten ke PYTHONPATH " dan " Tambahkan sumber akar ke PYTHONPATH ". Ketika saya tidak mencentang keduanya, saya dapat memuat modul saya.

Jadi itu berfungsi sekarang - tapi mengapa ?

Pertanyaan lebih lanjut muncul:

  • Apa itu "root konten" dan apa yang "root sumber"? Dan mengapa menambahkan sesuatu ke PYTHONPATH membuatnya entah bagaimana rusak?
  • haruskah saya hapus centang pada kedua opsi tersebut sepanjang waktu (demikian juga dalam pengaturan standar, tidak hanya konfigurasi spesifik proyek (panel kiri dari dialog Konfigurasi Konfigurasi Jalankan / Debug)?
Claus
sumber
2
Anda mungkin sudah mencoba ini tetapi ketika mengimpor modul dari paket lain, sertakan nama paket from foldername.mymodule import mymethod. Hal lain yang harus saya lakukan adalah menambahkan folder _init .py kosong di semua folder yang akan Anda gunakan untuk masuk ke modul Anda sehingga jika from parentfolder.childfolder.mymodule ...Anda perlu init dalam dua folder. Tergantung di mana folder berada relatif satu sama lain, Anda mungkin perlu memiliki paket tingkat atas sys.pathseperti yang dijelaskan dalam jawaban
ziddarth
4
Saya punya masalah Anda juga. Posting berikut ini memecahkan masalah saya: stackoverflow.com/questions/21236824/…
user3155053
Apakah Anda mengidentifikasi mengapa menghapus centang pada kotak centang itu benar-benar berfungsi sebagai lawan memeriksanya?
Nithish Inpursuit Ofhappiness
Apa yang berhasil untuk saya adalah tidak Enable Django Supportmemeriksa pengaturan Languages & Frameworks -> Djangodi versi Pro PyCharm. Itu membuka konsol Django yang menyebabkan masalah impor.
Eric Blum

Jawaban:

324

Jika modul Anda sendiri berada di jalur yang sama, Anda perlu menandai jalur tersebut sebagai Sources Root. Di penjelajah proyek, klik kanan pada direktori yang ingin Anda impor. Kemudian pilih Mark Directory Asdan pilih Sources Root.

Saya harap ini membantu.

Beatriz Fonseca
sumber
9
Ini bekerja untuk saya, tetapi saya juga harus menghapus dan membuat ulang konfigurasi jalankan yang sebelumnya saya buat sebelum menandai folder sebagai sumber root.
Grinch
2
Dan perlu menambahkan __init__.pyuntuk membuat Python memperlakukan direktori sebagai berisi paket: stackoverflow.com/questions/448271/…
Beatriz Fonseca
Bagaimana Anda melakukan ini jika Anda tidak menggunakan pycharm? Saya mengalami masalah yang sama persis.
Boudewijn Aasman
@BeatrizFonseca Ya saya lakukan. Saya tidak bisa membuatnya bekerja dengan luhur, tetapi saya menginstal pycharm dan mencoba jawabannya di sini dan itu bekerja dengan sangat baik, jadi itu pasti ada hubungannya dengan menentukan direktori yang tepat sebagai paket root.
Boudewijn Aasman
@BoudewijnAasman Anda dapat mencoba menggunakan .sebelum nama paket untuk menentukan bahwa paket ini adalah paket lokal
Beatriz Fonseca
37

Jadi, jika Anda pergi ke

-> Pengaturan -> Proyek: My_project -> Struktur Proyek,

Hanya direktori di mana kode sumber tersedia dan tandai sebagai "Sumber" (Anda dapat melihatnya di jendela yang sama). Direktori dengan kode sumber harus berubah menjadi biru. Sekarang Anda dapat mengimpor modul yang berada di direktori yang sama.

JRD
sumber
3
Saya menyadari ini adalah posting lama tapi berhasil buat saya, terima kasih.
Mike - SMT
1
Menemukan dan mengabaikan jawaban yang sama berkali-kali, kali ini mencoba dan berhasil!
A.Ametov
29

Komunitas / Profesional PyCharm 2018.2.1

Saya mengalami masalah ini sekarang dan saya bisa menyelesaikannya dengan cara yang mirip yang ditunjukkan oleh @Beatriz Fonseca dan @Julie.

Jika Anda masuk ke File-> Settings-> Project: YourProjectName-> Project Structure, Anda akan memiliki tata letak direktori dari proyek yang sedang Anda kerjakan. Anda harus menelusuri direktori dan memberi label sebagai Sourcedirektori untuk semua file Sumber Anda , atau sebagai Resourcefolder untuk file yang hanya untuk impor.

Anda juga ingin memastikan bahwa Anda menempatkan __init__.pyfile dalam direktori sumber daya Anda, atau benar-benar di mana pun Anda ingin mengimpor, dan itu akan berfungsi dengan baik.

Saya harap jawaban ini membantu seseorang, dan semoga JetBrains akan memperbaiki bug yang mengganggu ini.

Oleg Silkin
sumber
2
Ini tidak khusus untuk PyCharm Professional , tetapi fitur ini juga tersedia dalam edisi Komunitas PyCharm . Dalam Struktur Proyek, klik kanan direktori yang berisi modul kemudian pilih Mark Directory asdari menu konteks dan pilih Sources Root.
Astitva Srivastava
1
Bisakah Anda memberi tahu apa artinya Root Sumber ini. Meskipun itu menyelesaikan masalah saya tetapi tidak mengerti mengapa saya melakukannya.
user3341078
8

Apa yang saya coba adalah sumber lokasi di mana file saya berada.

misalnya E:\git_projects\My_project\__init__.py is my location.

Saya pergi ke File -> Setting -> Project: My_project -> Project Structure dan menambahkan root konten ke tentang tempat yang disebutkan E:\git_projects\My_project

itu berhasil untuk saya.

Virendra Patel
sumber
2
Sumber folder dalam Struktur Proyek berfungsi untuk saya. Terima kasih.
Mikro
Terima kasih @Virendra Patel dan @Microos. Proyek pycharm saya ada di /home/my_user/git_projects/this_git_project/this_pycharm_project/. Saya menambahkan /home/my_user/git_projects/this_git_project/sebagai root konten dan /home/my_user/git_projects/this_git_project/this_pycharm_project/sebagai satu-satunya folder sumber dan semuanya berhasil akhirnya.
KLaz
3

my_moduleadalah folder bukan modul dan Anda tidak dapat mengimpor folder, coba pindah my_mod.pyke folder yang sama dengan cool_script.pydan kemudian lakukan import my_mod as mm. Ini karena python hanya melihat di direktori saat ini dan sys.path, dan karenanya tidak akan menemukan my_mod.pykecuali itu di direktori yang sama

Atau Anda dapat melihat di sini untuk jawaban yang memberi tahu Anda cara mengimpor dari direktori lain.

Mengenai pertanyaan Anda yang lain, saya tidak tahu karena saya tidak menggunakan PyCharm.

Tom
sumber
Anda dapat membuat init .py dalam folder, juru bahasa python akan dibaca sebagai paket python: mikegrouchy.com/blog/2012/05/be-pythonic-__init__py.html
Beatriz Fonseca
3

Saya mendapatkan kesalahan dengan "Tambahkan akar sumber ke PYTHONPATH" juga. Masalah saya adalah bahwa saya memiliki dua folder dengan nama yang sama, seperti project/subproject1/thing/srcdan project/subproject2/thing/srcdan saya memiliki keduanya ditandai sebagai root sumber. Ketika saya mengganti nama salah satu "thing"folder menjadi "thing1"(nama unik apa pun), itu berhasil.

Mungkin jika PyCharm secara otomatis menambahkan root sumber yang dipilih, itu tidak menggunakan path lengkap dan karenanya mencampur folder dengan nama yang sama.

RubberDuckRabbit
sumber
2

Ini bisa disebabkan ketika interpreter Python tidak dapat menemukan kode Anda. Anda harus menyebutkan secara eksplisit ke Python untuk menemukan kode Anda di lokasi ini.

Untuk melakukannya:

  • Pergi ke konsol python Anda
  • Tambahkan sys.path.extend(['your module location'])ke konsol Python.

Dalam kasus Anda:

  • Pergi ke konsol python Anda,
  • Di awal, tulis kode berikut:

    import sys
    sys.path.extend([my module URI location])
  • Setelah Anda menulis pernyataan ini, Anda dapat menjalankan perintah berikut:

    from mymodule import functions
Shravan Shetty
sumber
Agak jelek untuk menambahkan path seperti itu tetapi itu berhasil untuk saya.
Florian Blume
ini harus dilakukan oleh pycharm, secara otomatis ketika membuka konsol dia harus menyertakan perintah sys.path.extend untuk direktori termasuk dependensi (proyek lain) dan direktori yang mengandung kode sumber dari proyek ini. TETAPI TIDAK MELAKUKANNYA secara otomatis
fabiob
2

Langkah membingungkan utama yang harus dilakukan adalah membuat ulang konfigurasi run untuk file sumber yang Anda coba jalankan, sehingga IDE mengambil jalur baru.

Cara yang benar-benar bekerja untuk saya adalah dengan pergi ke Jalankan / Edit Konfigurasi ..., pilih konfigurasi untuk file yang Anda coba jalankan di sisi kiri, hapus centang pada kotak "Tambahkan sumber akar ke PYTHONPATH", simpan, lalu kembali dan centang kotak dan simpan. MAKA itu akan berhasil.

tomchappell
sumber
Hebatnya, inilah yang saya butuhkan, meski melakukan Invalidate Cache/Restartdua kali!
Josh Friedlander
1

Root konten adalah folder yang menyimpan kode proyek Anda sementara root sumber didefinisikan juga sama. Satu-satunya perbedaan yang saya pahami adalah bahwa kode di root sumber dibuat sebelum kode di root konten.

Hapus centang pada mereka tidak akan mempengaruhi runtime sampai Anda tidak membuat modul terpisah dalam paket Anda yang secara manual terhubung ke Django. Itu berarti jika ada file Anda yang tidak memegang 'from django import ...' atau salah satu fungsi tidak dipanggil melalui django, menghapus centang pada 2 opsi ini akan mengakibatkan kegagalan fungsi.

Pembaruan - masalah hanya muncul ketika menggunakan Virtual Environmanet, dan hanya ketika mengendalikan proyek melalui terminal yang disediakan. Karena terminal masih bekerja melalui sistem pyhtonpath default dan bukan env virtual. sedangkan panel kontrol python django berfungsi dengan baik.

RA123
sumber
1

Solusi untuk masalah ini tanpa harus Menandai Direktori sebagai Source Root adalah dengan Edit Run Configurations dan dalam Eksekusi pilih opsi "Redirect input from" dan pilih skrip yang ingin Anda jalankan. Ini berfungsi karena kemudian diperlakukan seolah-olah skrip dijalankan secara interaktif di direktori ini. Namun Python masih akan menandai nama modul dengan kesalahan "tidak ada modul bernama x":

Redirect input dari:

Ketika penerjemah mengeksekusi pernyataan impor, ia mencari x.py dalam daftar direktori yang dikumpulkan dari sumber-sumber berikut:

  1. Direktori tempat skrip input dijalankan atau direktori saat ini jika interpreter dijalankan secara interaktif
  2. Daftar direktori yang terdapat dalam variabel lingkungan PYTHONPATH, jika diatur.
  3. Daftar direktori yang tergantung pada instalasi yang dikonfigurasi pada saat Python diinstal, dalam kasus saya usr / lib / python3.6 di Ubuntu.
PyFox
sumber
0

Pycharm 2017.1.1

  1. Klik pada View->ToolBar&View->Tool Buttons
  2. Pada panel kiri Projectakan terlihat, klik kanan padanya dan tekan Autoscroll to source lalu jalankan kode Anda.

Ini berhasil untuk saya.

AB Abhi
sumber
0

Dalam -s. beberapa proyek

Jika Anda memiliki someDirectory / someProjectDir dan dua file, file1.py dan file2.py, dan file1.py mencoba mengimpor dengan baris ini

dari file impor someProjectDir2

Itu tidak akan berfungsi, bahkan jika Anda telah menetapkan someProjectDir sebagai direktori sumber, dan bahkan jika itu ditampilkan dalam preferensi, proyek, menu struktur proyek sebagai root konten. Satu-satunya cara kerjanya adalah dengan menghubungkan proyek seperti yang ditunjukkan di atas (perintah unix, bekerja di mac, tidak yakin untuk menggunakan atau sintaks untuk Windows). Tampaknya ada beberapa mekanisme di mana Pycharm melakukan ini secara otomatis baik dalam checkout dari kontrol versi atau menambahkan sebagai root konteks, karena tautan lunak dibuat oleh Pycharm dalam proyek dependen. Oleh karena itu, hanya menyalin yang sama, meskipun replikasi aneh dari direktori itu mengganggu dan keharusan membingungkan. Juga di ketergantungan tempat otomatis dibuat, itu tidak ditampilkan sebagai direktori baru di bawah kontrol versi. Mungkin perbandingan file .idea akan mengungkapkan lebih banyak.

pengguna10895922
sumber
-1

Jawaban yang berhasil bagi saya memang apa yang disebutkan OP dalam pembaruan 2015: hapus centang dua kotak ini di config run Python Anda:

  • "Tambahkan root konten ke PYTHONPATH"
  • "Tambahkan akar sumber ke PYTHONPATH"

Saya sudah memiliki set config yang diatur untuk menggunakan venv yang tepat, jadi PyCharm melakukan pekerjaan tambahan untuk menambahkan hal-hal ke jalan tidak diperlukan. Sebaliknya itu menyebabkan kesalahan.

bsberry
sumber