Saya sedang mengerjakan paket dengan Python. Saya menggunakan virtualenv. Saya mengatur jalur ke root modul di jalur .pth di virtualenv saya, sehingga saya dapat mengimpor modul dari paket sambil mengembangkan kode dan melakukan pengujian (Pertanyaan 1: apakah ini cara yang baik untuk dilakukan?). Ini berfungsi dengan baik (ini adalah contoh, ini adalah perilaku yang saya inginkan):
(VEnvTestRc) zz@zz:~/Desktop/GitFolders/rc$ python
Python 2.7.12 (default, Jul 1 2016, 15:12:24)
[GCC 5.4.0 20160609] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> from rc import ns
>>> exit()
(VEnvTestRc) zz@zz:~/Desktop/GitFolders/rc$ python tests/test_ns.py
issued command: echo hello
command output: hello
Namun, jika saya mencoba menggunakan PyTest, saya mendapatkan beberapa pesan kesalahan impor:
(VEnvTestRc) zz@zz:~/Desktop/GitFolders/rc$ pytest
=========================================== test session starts ============================================
platform linux2 -- Python 2.7.12, pytest-3.0.5, py-1.4.31, pluggy-0.4.0
rootdir: /home/zz/Desktop/GitFolders/rc, inifile:
collected 0 items / 1 errors
================================================== ERRORS ==================================================
________________________________ ERROR collecting tests/test_ns.py ________________________________
ImportError while importing test module '/home/zz/Desktop/GitFolders/rc/tests/test_ns.py'.
Hint: make sure your test modules/packages have valid Python names.
Traceback:
tests/test_ns.py:2: in <module>
from rc import ns
E ImportError: cannot import name ns
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! Interrupted: 1 errors during collection !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
========================================= 1 error in 0.09 seconds ==========================================
(VEnvTestRc) zz@zz:~/Desktop/GitFolders/rc$ which pytest
/home/zz/Desktop/VirtualEnvs/VEnvTestRc/bin/pytest
Saya agak bingung, sepertinya ini menunjukkan kesalahan impor, tetapi Python tidak masalah jadi mengapa ada masalah khusus dengan PyTest? Adakah saran untuk alasan / perbaikan (Pertanyaan 2)? Saya mencari di Google dan menumpuk kesalahan 'ImportError: tidak dapat mengimpor' untuk PyTest, tetapi klik yang saya dapatkan terkait dengan jalur python yang hilang dan perbaikan untuk ini, yang tampaknya bukan masalah di sini. Ada saran?
Saya tidak bisa mengatakan saya mengerti mengapa ini berhasil, tetapi saya memiliki masalah yang sama dan tes berfungsi dengan baik jika saya menjalankan
python -m pytest
.Saya berada di virtualenv, dengan pytest juga tersedia secara global:
sumber
python -m pytest [...]
"juga akan menambahkan direktori saat ini kesys.path
".python3 -m pytest
PYTHONPATH=.:./src pytest
sebagai target sasaran.Saya baru saja menyelesaikan ini dengan menghapus __init__.py di root proyek saya:
sumber
__init__.py file in a folder containing TESTS
tidak menyelesaikan masalah saya. Yang ini berhasil. Saya kira itu karena hierarki file.__init__.py
file. Saya masih menghadapi masalah. Menambahkan file conftest.py ke direktori root berhasil untuk saya.Saya memiliki masalah yang sama tetapi karena alasan lain selain yang disebutkan:
Saya telah menginstal py.test secara global, sedangkan paket diinstal di lingkungan virtual.
Solusinya adalah menginstal
pytest
di lingkungan virtual. (Jika shell Anda mencirikan file yang dapat dieksekusi, seperti yang dilakukan Bash, gunakanhash -r
, atau gunakan jalur lengkap kepy.test
)sumber
pytest
virtualenv yang dibuat olehconda
, namunpytest
itu tersedia di lingkungan root anaconda. Oleh karena itu pytest dapat ditemukan, tetapi tidak ada paket yang diinstal di lingkungan.pip3 install pytest
di dalam virtualenv memperbaiki masalah.Masalah ini akan terjadi jika Anda memiliki
tests.py
file dan folder tes dengantests/__init__.py
.Selama pengumpulan pytest menemukan foldernya, tetapi ketika mencoba mengimpor file uji dari folder,
tests.py
file akan menyebabkan masalah impor.Untuk memperbaikinya cukup hapus
tests.py
file dan letakkan semua tes Anda di dalamtests/
folder.Untuk kasus khusus Anda, perbaikannya akan tepat:
/home/zz/Desktop/GitFolders/rc/tests.py
/home/zz/Desktop/GitFolders/rc/tests/__init__.py
adasumber
Saya mengalami masalah yang sama, kesalahan yang sama persis, tetapi penyebabnya berbeda. Saya menjalankan kode pengujian dengan baik, tetapi terhadap modul versi lama. Dalam versi sebelumnya dari kode saya, satu kelas ada, sedangkan yang lainnya tidak. Setelah memperbarui kode saya, saya harus menjalankan perintah berikut untuk menginstalnya.
sudo pip install ./ --upgrade
Setelah menginstal modul yang diperbarui menjalankan pytest menghasilkan hasil yang benar (karena saya menggunakan basis kode yang benar).
sumber
pip install ./ --upgrade
memperbarui versi lib yang diinstal dengan kode terbaru, dan mengaktifkan pytest untuk menemukan versi terbaru ini juga.Dalam kasus saya, kesalahan impor terjadi karena paket mengarah ke paket / direktori lain dengan nama yang sama dan jalurnya satu tingkat di atas folder yang sebenarnya saya inginkan. Saya rasa ini juga menjelaskan mengapa beberapa orang perlu menghapus _ init _.py sementara yang lain perlu menambahkan kembali.
Saya hanya meletakkan
print(the_root_package.__path__)
(setelahimport the_root_package
) di keduapython
konsol danpytest
skrip untuk membandingkan perbedaannyaBAWAH BARIS: Ketika Anda melakukannya
python
, paket yang Anda impor mungkin berbeda dari paket saat Anda menjalankanpytest
.sumber
Instal paket ke dalam lingkungan virtual Anda.
Kemudian mulai shell baru dan sumber lingkungan virtual Anda lagi.
sumber
Jawaban di atas tidak berhasil untuk saya. Saya baru saja menyelesaikannya dengan menambahkan jalur absolut dari modul yang tidak ditemukan
sys.path
di bagian atastest_xxx.py
(modul pengujian Anda), seperti:sumber
test_main.py
, saya memasukkannya ke dalamconftest.py
direktori pengujian saya, dan itu berhasil. Terima kasih telah memberikan solusi terprogram, bukan sampah file.Jika terkait dengan kode python yang awalnya dikembangkan di python 2.7 dan sekarang bermigrasi ke python 3.x maka masalahnya mungkin terkait dengan masalah impor.
misalnya saat mengimpor objek dari file:
base
yang terletak di direktori yang sama, ini akan berfungsi di python 2.x:di python 3.x Anda harus mengganti dengan
base
path lengkap atau.base
tidak melakukannya akan menyebabkan masalah di atas. jadi cobalah:sumber
Saya mengalami masalah ini hari ini dan menyelesaikannya dengan menelepon
python -m pytest
dari root direktori proyek saya.Panggilan
pytest
dari lokasi yang sama masih menyebabkan masalah.Direktori Proyek saya diatur sebagai:
Modul
routes
diimpor di sayatest_routes.py
as:from server.routes.routes import Routes
Semoga membantu!
sumber
Kasus khusus lainnya:
Saya mengalami masalah saat menggunakan racun. Jadi program saya berjalan dengan baik, tetapi unittests via tox terus mengeluh. Setelah menginstal paket (diperlukan untuk program), Anda perlu menentukan paket tambahan yang digunakan dalam unittests di tox.ini
sumber
Saya mendapatkan ini menggunakan VSCode. Saya memiliki lingkungan conda. Saya tidak berpikir ekstensi python VScode dapat melihat pembaruan yang saya buat.
Saya harus lari
pip install ./ --upgrade
sumber
Directory './' is not installable. Neither 'setup.py' nor 'pyproject.toml' found.
Edit conftest.py Anda dan tambahkan baris kode berikut:
Dan jika mencoba menjalankan kasus uji melalui terminal, gunakan contoh berikut:
sumber
NameError: name 'file' is not defined
- apa yang harus mengajukan sama dengan?Kemenangan besar lainnya untuk sistem impor Python. Saya pikir alasan tidak ada konsensus adalah bahwa apa yang berhasil mungkin tergantung pada lingkungan Anda dan alat yang Anda gunakan di atasnya.
Saya menggunakan ini dari VS Code, dalam test explorer di bawah Windows di lingkungan conda, Python 3.8.
Penyiapan yang harus saya lakukan adalah:
Di bawah pengaturan ini, intellisense bekerja dan begitu pula penemuan pengujian.
Perhatikan bahwa saya awalnya mencoba yang berikut, seperti yang direkomendasikan di sini .
Saya tidak dapat menemukan cara untuk membuat ini bekerja dari VS Code karena
src
foldernya hanya meniup pikiran sistem impor. Saya bisa membayangkan ada cara untuk membuatnya bekerja dari baris perintah. Sebagai orang yang relatif baru beralih ke pemrograman Python, ini memberi saya perasaan nostalgia bekerja dengan COM, tetapi menjadi sedikit kurang menyenangkan.sumber
2 sen saya ini: pytest akan gagal secara kebetulan jika Anda tidak menggunakan lingkungan virtual. Terkadang itu akan berhasil, terkadang tidak.
Oleh karena itu, solusinya adalah:
Kode, menggunakan windows PowerShell:
Lalu akhirnya
Contoh setup.py, untuk pip install -e:
sumber
Saya tidak setuju dengan postingan yang mengatakan bahwa Anda harus menghapus
__init__.py
file apa pun . Yang harus Anda lakukan adalah mengubahsys.path
.Jalankan eksperimen tempat Anda mencetak
sys.path
saat menjalankan kode seperti biasa. Lalu cetaksys.path
sambil menjalankan kode melalui pytest. Saya pikir Anda akan menemukan bahwa ada perbedaan antara kedua jalur ini, karena itulah pytest pecah.Untuk memperbaikinya, masukkan jalur dari eksperimen pertama di indeks ke-0 dari eksperimen kedua.
Membiarkan
'/usr/exampleUser/Documents/foo'
menjadi elemen pertamaprint(sys.path)
untuk percobaan 1.Di bawah ini adalah kode yang seharusnya memperbaiki masalah Anda:
import sys sys.path[0] = '/usr/exampleUser/Documents/foo'
Letakkan ini di bagian atas file Anda, sebelum pernyataan impor Anda yang sebenarnya.
Sumber: Saya menangani ini sendiri dan proses di atas menyelesaikannya.
sumber
Biarkan semuanya tetap sama dan baru saja menambahkan file tes kosong di folder root .. Selesaikan
Berikut temuannya, masalah ini benar-benar mengganggu saya untuk sementara waktu. Struktur folder saya dulu
dan pytest akan mengeluh dengan ModuleNotFoundError dan memberikan PETUNJUK - pastikan modul / paket pengujian Anda memiliki nama Python yang valid.
Saya memperkenalkan file uji tiruan pada tingkat yang sama dengan direktori mathsapp dan tes. File tersebut tidak berisi apa-apa. Sekarang pytest tidak mengeluh.
Hasil tanpa file
Hasil dengan file
sumber
Saya memecahkan masalah saya dengan mengatur
PYTHONPATH
di Variabel Lingkungan untuk konfigurasi spesifik yang saya gunakan untuk pengujian.Saat Anda melihat file pengujian di PyCharm:
Ctrl
+Shift
+A
Edit Configurations
PYTHONPATH
bawah variabel Lingkungan> Lingkungan.sumber
Cukup letakkan
conftest.py
file kosong di direktori root proyek, karena ketikapytest
menemukan conftest.py, itu memodifikasi sys.path sehingga dapat mengimpor barang dariconftest
modul. Struktur direktori umum dapat berupa:sumber
Memiliki masalah serupa dan berhasil ketika saya menambahkan
__init__.py
file di bawah direktori tes.sumber
Bisa jadi Pytest tidak membaca paket sebagai modul Python sedangkan Python membaca (kemungkinan karena masalah jalur). Coba ubah direktori skrip pytest atau tambahkan modul secara eksplisit ke PYTHONPATH Anda.
Atau bisa jadi Anda memiliki dua versi Python yang diinstal di mesin Anda. Periksa sumber Python Anda untuk pytest dan untuk shell python yang Anda jalankan. Jika berbeda (yaitu Python 2 vs 3), gunakan
source activate
untuk memastikan bahwa Anda menjalankan pytest yang diinstal untuk python yang sama dengan tempat modul diinstal.sumber
Bagi siapa pun yang mencoba segalanya dan masih mendapatkan kesalahan, saya punya solusi.
Di folder tempat pytest diinstal , buka pytest-env folder .
Buka file pyvenv.cfg .
Dalam file, ubah include-system-site-packages dari false menjadi true .
Semoga berhasil. Jangan lupa untuk memilih.
sumber
Jika Anda sudah memiliki file .pyc, coba hapus.
Hari ini, saya mengalami masalah ini, inilah yang terjadi:
pertama saya menjalankan pytest di mac (ini akan menghasilkan file pyc) kemudian saya meluncurkan kontainer buruh pelabuhan (os alpine), dengan dir proyek terpasang, dan kemudian ketika saya mencoba menjalankan pytest di kontainer, terjadi ImportError. setelah membersihkan semua file pyc, tidak ada kesalahan lagi.
Semoga bermanfaat.
sumber
jika Anda memerlukan file init .py di folder Anda, buat salinan folder dan hapus init .py di folder itu untuk menjalankan pengujian, ini berfungsi untuk proyek lokal. Jika Anda perlu menjalankan pengujian secara teratur, lihat apakah Anda dapat memindahkan init .py Anda ke file terpisah.
sumber
[Terselesaikan] Sebelum langsung beralih ke solusi penghapusan / penambahan
__init__.py
, kami mungkin juga ingin melihat bagaimana impor dilakukan di kelas Anda. Sebenarnya, saya kehilangan satu hari bermain-main dengan hanya__init__.py
memikirkan itu mungkin masalahnya :) Namun, itu cukup informatif.Dalam kasus saya, itu adalah cara yang salah untuk memanggil kelas dari satu kelas python ke kelas python lain yang melempar
ImportError
. Memperbaiki cara kelas / modul dipanggil dan berfungsi seperti pesona. Semoga ini bisa membantu orang lain juga.Dan ya, untuk kesalahan serupa, kami mungkin memiliki solusi yang berbeda tergantung pada bagaimana kode tersebut ditulis. Lebih baik menghabiskan lebih banyak waktu untuk self debugging. Hal yang dipelajari :) Selamat membuat kode !!!
sumber
Dalam kasus saya, saya bekerja di sebuah wadah dan sayangnya pytest memiliki kecenderungan untuk menggunakan python2.7 daripada penerjemah python3 pilihan saya.
Dalam kasus saya ini berhasil:
Struktur folder saya
sumber
Saya telah menempatkan semua tes saya di folder tes dan mendapatkan kesalahan yang sama. Saya menyelesaikan ini dengan menambahkan init .py di folder itu seperti:
sumber