Saya memiliki folder untuk kode klien saya, folder untuk kode server saya, dan folder untuk kode yang dibagikan di antara mereka
Proj/
Client/
Client.py
Server/
Server.py
Common/
__init__.py
Common.py
Bagaimana cara mengimpor Common.py dari Server.py dan Client.py?
Jawaban:
EDIT November 2014 (3 tahun kemudian):
Python 2.6 dan 3.x mendukung impor relatif yang tepat, di mana Anda dapat menghindari melakukan apa pun yang meretas. Dengan metode ini, Anda tahu bahwa Anda mendapatkan impor relatif daripada impor absolut . '..' artinya, buka direktori di atas saya:
Sebagai peringatan, ini hanya akan berfungsi jika Anda menjalankan python Anda sebagai modul, dari luar paket. Sebagai contoh:
Cara hacky asli
Anda dapat menambahkan Common / ke sys.path Anda (daftar jalur yang dilihat python untuk mengimpor sesuatu):
os.path.dirname(__file__)
hanya memberi Anda direktori tempat file python Anda saat ini, dan kemudian kami menavigasi ke 'Common /' direktori dan mengimpor 'Common' modul.sumber
from ...myfile
pergi ke../../myfile
Cukup lucu, masalah yang sama yang baru saja saya temui, dan saya mendapatkan pekerjaan ini dengan cara berikut:
menggabungkan dengan perintah linux
ln
, kita dapat membuat segalanya lebih sederhana:Dan, sekarang jika Anda ingin mengimpor
some_stuff
dari file:Proj/Common/Common.py
ke file Anda:,Proj/Client/Client.py
seperti ini:Dan, hal yang sama berlaku untuk
Proj/Server
, Juga berfungsi untuksetup.py
proses, pertanyaan yang sama dibahas di sini , semoga membantu!sumber
Jangan lakukan impor relatif.
Dari PEP8 :
Masukkan semua kode Anda ke dalam satu paket super (yaitu "myapp") dan gunakan subpaket untuk klien, server, dan kode umum.
Pembaruan: " Python 2.6 dan 3.x mendukung impor relatif yang tepat (...) ". Lihat jawaban Dave untuk lebih jelasnya.
sumber
if __name__ == "__main__":
'. Artinya, Anda ingin dapat menggunakannya sebagai skrip yang berdiri sendiri. Bagaimana melakukannya dengan benar? Saya pikir itu kasus penggunaan umum yang harus didukung. Mengapa itu kecil hati?Melakukan impor relatif sama sekali tidak masalah! Inilah yang saya lakukan:
sumber
__file__
untuk mendapatkan hubungan yang tepat dari file saat iniMetode impor default sudah "relatif", dari PYTHONPATH. PYTHONPATH secara default, ke beberapa pustaka sistem bersama dengan folder dari file sumber asli. Jika Anda menjalankan dengan -m untuk menjalankan modul, direktori saat ini akan ditambahkan ke PYTHONPATH. Jadi jika titik masuk program Anda ada di dalam Proj, maka gunakan
import Common.Common
seharusnya berfungsi di dalam Server.py dan Client.py.Jangan lakukan impor relatif. Ini tidak akan berhasil seperti yang Anda inginkan.
sumber