Saya memiliki struktur folder berikut.
application/app/folder/file.py
dan saya ingin mengimpor beberapa fungsi dari file.py di file Python lain yang berada di
application/app2/some_folder/some_file.py
Saya sudah mencoba
from application.app.folder.file import func_name
dan beberapa upaya lainnya tetapi sejauh ini saya tidak dapat mengimpor dengan benar. Bagaimana saya bisa melakukan ini?
Jawaban:
Secara default, Anda tidak bisa. Saat mengimpor file, Python hanya mencari direktori saat ini, direktori tempat skrip entry-point dijalankan, dan
sys.path
yang mencakup lokasi seperti direktori instalasi paket (sebenarnya sedikit lebih kompleks dari ini, tetapi ini mencakup sebagian besar kasus) .Namun, Anda dapat menambahkan ke jalur Python saat runtime:
sumber
sys.path.append('/path/to/application/app/folder')
is cleaner imosys.path
mengembalikan alist
, bukan adeque
, dan itu konyol untuk mengonversikannyalist
menjadideque
dan kembali.Tidak ada yang salah dengan:
Pastikan
folder
juga mengandung__init__.py
, ini memungkinkan untuk dimasukkan sebagai paket. Tidak yakin mengapa jawaban lain dibicarakanPYTHONPATH
.sumber
PYTHONPATH
diperlukan. Katakanlah Anda memiliki dua folder pada level yang sama:A
danB
.A
memiliki__init.py__
. Coba impor sesuatu dariB
dalamA
.init.py
atau__init__.py
file?application
danapp
adalah paket sudah (yaitu Anda sudah memiliki__init__.py
di keduanya). Sebagai hasil dari penambahan__init__.py
juga menjadifolder
,application.app.folder
(sub) paket , dari mana Anda dapat mengakses modulapplication.app.folder.file
, yang simbolnyafunc_name
sekarang dapat diimporKetika modul berada di lokasi paralel, seperti dalam pertanyaan:
Singkatan ini membuat satu modul terlihat oleh yang lain:
sumber
sys.path.append(os.path.dirname(os.path.abspath(__file__)))
cli/foo.py
dari baris perintah dapatimport cli.bar
sys.path.append('.')
mengimpor modul dengan menggunakanfrom app2.some_folder.some_file import your_function
. Atau yang berfungsi untuk saya adalah menjalankanpython3 -m app2.another_folder.another_file
dari folder root.Pertama sys impor di name-file.py
Kedua tambahkan path folder di name-file.py
Ketiga, buat file kosong bernama __ init __.py di subdirektori Anda (ini memberi tahu Python itu paket)
Impor keempat modul di dalam folder di name-file.py
sumber
sys.path.insert
perintah-. Dengan demikian, jawabannya meninggalkan pertanyaan, apakah solusi ini berfungsi bahkan ketika folder nama berada di lokasi yang arbitrer.Saya pikir cara ad-hoc akan menggunakan variabel lingkungan
PYTHONPATH
seperti yang dijelaskan dalam dokumentasi: Python2 , Python3sumber
Jawaban di sini kurang jelas, ini diuji pada Python 3.6
Dengan struktur folder ini:
Di mana
myfile.py
memiliki konten:Pernyataan impor dalam
main.py
adalah:dan ini akan mencetak halo .
sumber
__init__.py
?__init__.py
tidak berfungsi untuk saya. Saya menggunakan Py 3.6.5 di Ubuntu 18. Ini bekerja pada Pycharm tetapi tidak dari terminalMasalah Anda adalah bahwa Python mencari di direktori Python untuk file ini dan tidak menemukannya. Anda harus menentukan bahwa Anda berbicara tentang direktori tempat Anda berada dan bukan direktori Python.
Untuk melakukan ini, Anda ubah ini:
from application.app.folder.file import func_name
untuk ini:
Dengan menambahkan titik Anda mengatakan lihat di folder ini untuk folder aplikasi daripada melihat di direktori Python.
sumber
Dari yang saya tahu, tambahkan
__init__.py
file langsung di folder fungsi yang ingin Anda impor akan melakukan pekerjaan.sumber
sys.path.append(tools_dir)
Windows dan saya tidak perlu menambahkan__init__.py' file in my directory
tools_dir`Dalam Python 3.4 dan yang lebih baru, Anda dapat mengimpor dari file sumber secara langsung (tautan ke dokumentasi) . Ini bukan solusi paling sederhana, tapi saya memasukkan jawaban ini untuk kelengkapan.
Berikut ini sebuah contoh. Pertama, file yang akan diimpor, bernama
foo.py
:Kode yang mengimpor file di atas, sangat terinspirasi oleh contoh dalam dokumentasi:
Hasil:
Perhatikan bahwa nama variabel, nama modul, dan nama file tidak perlu cocok. Kode ini masih berfungsi:
Hasil:
Modul yang diimpor secara program diperkenalkan dengan Python 3.1 dan memberi Anda lebih banyak kontrol atas bagaimana modul diimpor. Lihat dokumentasi untuk informasi lebih lanjut.
sumber
Bekerja untuk saya di python3 di linux
sumber
sys.path.append("/home/linux/folder/")
- Pastikan jangan menggunakan jalan pintas misalnya"~/folder/"
Coba impor relatif Python:
Setiap titik awal adalah level lain yang lebih tinggi dalam hierarki yang dimulai dengan direktori saat ini.
Masalah? Jika ini tidak bekerja untuk Anda, maka Anda mungkin mendapatkan sedikit dari banyak impor relatif gotcha. Baca jawaban dan komentar untuk detail lebih lanjut: Bagaimana cara memperbaiki "Impor relatif yang diupayakan dalam non-paket" bahkan dengan __init__.py
Petunjuk: miliki
__init__.py
di setiap level direktori. Anda mungkin perlupython -m application.app2.some_folder.some_file
(meninggalkan .py) yang Anda jalankan dari direktori tingkat atas atau memiliki direktori tingkat atas itu di PYTHONPATH Anda. Fiuh!sumber
Saya dihadapkan dengan tantangan yang sama, terutama ketika mengimpor beberapa file, ini adalah bagaimana saya berhasil mengatasinya.
sumber
Mempertimbangkan
application
sebagai direktori root untuk proyek python Anda, buat__init__.py
file kosong di dalamnyaapplication
,app
danfolder
folder. Kemudian disome_file.py
lakukan perubahan sebagai berikut untuk mendapatkan definisi func_name:sumber
Menggunakan sys.path.append dengan jalur absolut tidak ideal saat memindahkan aplikasi ke lingkungan lain. Menggunakan jalur relatif tidak akan selalu berhasil karena direktori kerja saat ini tergantung pada bagaimana skrip dipanggil.
Karena struktur folder aplikasi telah diperbaiki, kita dapat menggunakan os.path untuk mendapatkan path lengkap dari modul yang ingin kita impor. Misalnya, jika ini strukturnya:
Dan katakanlah Anda ingin mengimpor modul "mangga". Anda dapat melakukan hal berikut di vanilla.py:
Tentu saja, Anda tidak perlu variabel mango_dir.
Untuk memahami cara kerjanya lihat contoh sesi interaktif ini:
Dan periksa dokumentasi os.path .
sumber
Ini bekerja untuk saya di windows
sumber
Saya cukup istimewa: Saya menggunakan Python dengan Windows!
Saya baru saja melengkapi informasi: untuk Windows dan Linux, path relatif dan absolut berfungsi
sys.path
(saya perlu path relatif karena saya menggunakan skrip saya pada beberapa PC dan di bawah direktori utama yang berbeda).Dan ketika menggunakan Windows baik
\
dan/
dapat digunakan sebagai pemisah untuk nama file dan tentu saja Anda harus menggandakan\
menjadi string Python,beberapa contoh yang valid:
(catatan: Saya pikir itu
/
lebih nyaman daripada\
, jika kurang 'Windows-asli' karena Linux-kompatibel dan lebih mudah untuk menulis dan menyalin ke Windows explorer)sumber
Jika tujuan memuat modul dari jalur tertentu adalah untuk membantu Anda selama pengembangan modul khusus, Anda dapat membuat tautan simbolis di folder yang sama dari skrip pengujian yang menunjuk ke akar modul khusus. Referensi modul ini akan diutamakan daripada modul lain yang diinstal dengan nama yang sama untuk setiap skrip yang dijalankan di folder itu.
Saya menguji ini di Linux tetapi harus bekerja di OS modern yang mendukung tautan simbolik.
Satu keuntungan dari pendekatan ini adalah Anda dapat menunjuk ke sebuah modul yang berada di copy kantor cabang SVC Anda sendiri yang dapat sangat menyederhanakan waktu siklus pengembangan dan mengurangi mode kegagalan mengelola berbagai versi modul.
sumber
Dalam kasus saya, saya memiliki kelas untuk diimpor. File saya terlihat seperti ini:
Di file utama saya, saya memasukkan kode melalui:
sumber
Saya bertemu pertanyaan yang sama beberapa kali, jadi saya ingin membagikan solusi saya.
Versi Python: 3.X
Solusi berikut ini untuk seseorang yang mengembangkan aplikasi Anda di Python versi 3.X karena Python 2 tidak didukung sejak Jan / 1/2020 .
Struktur Proyek
Dalam python 3, Anda tidak perlu
__init__.py
dalam subdirektori proyek Anda karena Paket Namespace Implisit . Lihat Apakah init .py tidak diperlukan untuk paket dalam Python 3.3+Pernyataan masalah
Di
file_b.py
, saya ingin mengimpor kelasA
difile_a.py
bawah folder a.Solusi
# 1 Cara cepat tapi kotor
Tanpa menginstal paket seperti Anda sedang mengembangkan proyek baru
Menggunakan
try catch
untuk memeriksa apakah ada kesalahan. Contoh kode:# 2 Instal paket Anda
Setelah Anda menginstal aplikasi Anda (dalam posting ini, tutorial instalasi tidak termasuk)
Anda bisa saja
Selamat coding!
sumber
Saya sedang mengerjakan proyek
a
yang saya ingin pengguna instal melaluipip install a
dengan daftar file berikut:setup.py
MANIFEST.in
a / init .py
a / a.py
a / b / init .py
a / b / b.py
Saya memasang modul dengan menjalankan yang berikut dari direktori dengan
MANIFEST.in
:Kemudian, dari lokasi yang sama sekali berbeda pada sistem file saya,
/moustache/armwrestle
saya dapat menjalankan:Yang mengkonfirmasi bahwa
a.cats
memang sama dengan 0 dana.b.dogs
memang sama dengan 1, sebagaimana dimaksud.sumber
Alih-alih hanya melakukan
import ...
, lakukan ini:from <MySubFolder> import <MyFile>
MyFile ada di dalam MySubFolder.
sumber
Anda dapat menyegarkan shell Python dengan menekan f5, atau pergi ke Run-> Run Module. Dengan cara ini Anda tidak perlu mengubah direktori untuk membaca sesuatu dari file. Python akan secara otomatis mengubah direktori. Tetapi jika Anda ingin bekerja dengan file yang berbeda dari direktori yang berbeda di Shell Python, maka Anda dapat mengubah direktori di sys, seperti yang dikatakan Cameron sebelumnya.
sumber
Jadi saya baru saja mengklik IDE saya, dan menambahkan yang baru
folder
dan bertanya-tanya mengapa saya tidak dapat mengimpor darinya. Kemudian saya menyadari bahwa saya harus mengklik kanan dan membuat Paket Python, dan bukan folder sistem file klasik. Atau metode post-mortem menambahkan__init__.py
(yang membuat python memperlakukan folder sistem file sebagai sebuah paket) sebagaimana disebutkan dalam jawaban lain. Menambahkan jawaban ini di sini untuk berjaga-jaga seandainya seseorang melewati rute ini.sumber
Anda dapat menggunakan importlib untuk mengimpor modul tempat Anda ingin mengimpor modul dari folder menggunakan string seperti ini:
Contoh ini memiliki main.py yang merupakan kode di atas lalu folder yang disebut Script dan kemudian Anda dapat memanggil apa pun yang Anda butuhkan dari folder ini dengan mengubah
scriptName
variabel. Anda kemudian dapat menggunakanscript
untuk referensi ke modul ini. seperti jika saya memiliki fungsi yang disebutHello()
dalam modul Snake Anda dapat menjalankan fungsi ini dengan melakukannya:Saya telah menguji ini dengan Python 3.6
sumber
Saya mengalami masalah ini beberapa kali. Saya sudah sering mengunjungi halaman ini. Dalam masalah terakhir saya, saya harus menjalankan
server
dari direktori tetap, tetapi setiap kali debug saya ingin menjalankan dari berbagai sub-direktori.melakukan TIDAK bekerja untuk saya karena pada modul yang berbeda saya harus membaca yang berbeda * .csv file yang semua berada di direktori yang sama.
Pada akhirnya, yang berhasil bagi saya bukanlah pythonic, saya kira, tetapi:
Saya menggunakan
if __main__
modul yang ingin saya debug , yang dijalankan dari jalur yang berbeda dari biasanya.Begitu:
sumber