Pertanyaan Mengapa menggunakan sys.path.append (path) daripada sys.path.insert (1, path)?


Edit: berdasarkan komentar Ulf Rompe, penting Anda menggunakan "1" alih-alih "0", jika tidak, anda akan hancur sys.path.

Saya telah melakukan python cukup lama sekarang (lebih dari satu tahun), dan saya selalu bingung mengapa orang menyarankan Anda untuk menggunakannya sys.path.append() dari pada sys.path.insert(). Biarkan saya menunjukkan.

Katakanlah saya sedang mengerjakan modul bernama PyWorkbooks (yang diinstal di komputer saya), tetapi saya secara bersamaan mengerjakan modul yang berbeda (katakanlah PyJob) yang menggabungkan PyWorkbooks. Saat saya mengerjakan PyJob, saya menemukan kesalahan dalam PyWorkbook yang saya koreksi, jadi saya ingin mengimpor versi pengembangan.

Ada beberapa cara untuk bekerja pada keduanya (saya bisa meletakkan proyek PyWorkbooks saya di dalam PyJob, misalnya), tetapi kadang-kadang saya masih perlu bermain dengan jalan. Namun, Saya tidak bisa begitu saja melakukan sys.path.append() ke folder tempat PyWorkbook berada. Mengapa? Karena python akan menemukan PyWorkbook saya yang terpasang terlebih dahulu!

Inilah sebabnya mengapa Anda harus melakukan sys.path.insert (1, path_to_dev_pyworkbooks)

Kesimpulan:

sys.path.append(path_to_dev_pyworkbooks)
import PyWorkbooks # does NOT import dev pyworkbooks, imports installed one

atau:

sys.path.insert(1, path_to_dev_pyworkbooks) # based on comments you should use **1 not 0**
import PyWorkbooks # imports correct file

Ini telah menyebabkan beberapa hangup bagi saya di masa lalu, dan saya benar-benar ingin jika kami (sebagai komunitas) mulai merekomendasikan sys.path.insert(1, path), seolah-olah Anda secara manual memasukkan jalur, saya pikir aman untuk mengatakan bahwa itu adalah jalur yang ingin Anda gunakan!

Atau apakah saya memiliki sesuatu yang salah? Ini pertanyaan yang terkadang mengganggu saya dan saya menginginkannya di tempat terbuka!


76
2018-04-10 19:19


asal


Jawaban:


Jika Anda memiliki banyak versi paket / modul, Anda harus menggunakannya virtualenv (penekanan saya):

virtualenv adalah alat untuk membuat lingkungan Python yang terisolasi.

Masalah dasar yang dibahas adalah salah satu dependensi dan versi, dan secara tidak langsung perizinan. Bayangkan Anda memiliki aplikasi yang membutuhkan versi 1 dari LibFoo, tetapi aplikasi lain membutuhkan versi 2. Bagaimana Anda bisa menggunakan kedua aplikasi ini? Jika Anda menginstal semuanya ke dalam /usr/lib/python2.7/site-packages (atau apa pun lokasi standar platform Anda), mudah berakhir dalam situasi ketika Anda secara tidak sengaja meningkatkan aplikasi yang seharusnya tidak ditingkatkan.

Atau lebih umum, bagaimana jika Anda ingin menginstal aplikasi dan biarkan saja? Jika suatu aplikasi berfungsi, perubahan apa pun di pustakanya atau versi pustaka tersebut dapat merusak aplikasi.

Selain itu, bagaimana jika Anda tidak dapat menginstal paket ke global site-packages direktori? Misalnya, pada host yang dibagikan.

Dalam semua kasus ini, virtualenv bisa membantumu. Ini menciptakan lingkungan yang memiliki direktori instalasinya sendiri, yang tidak membagikan pustaka dengan lingkungan virtualenv lainnya (dan secara opsional tidak mengakses pustaka yang dipasang secara global).

Itu sebabnya orang-orang mempertimbangkan insert(0, menjadi salah - ini adalah solusi yang tidak lengkap, solusi untuk masalah mengelola beberapa lingkungan.


41
2018-04-10 19:23



Jika Anda benar-benar perlu menggunakan sys.path.insert, pertimbangkan untuk meninggalkan sys.path [0] seperti ini:

sys.path.insert(1, path_to_dev_pyworkbooks)

Ini bisa menjadi penting karena kode pihak ketiga dapat mengandalkan dokumentasi sys.path kesesuaian:

Seperti yang diinisialisasi pada startup program, item pertama dari daftar ini,   path [0], adalah direktori yang berisi skrip yang digunakan untuk itu   panggil interpreter Python.


40
2018-04-10 22:47



Anda membingungkan konsep menambahkan dan prepending. kode berikut lebih lambat:

sys.path.insert(1,'/thePathToYourFolder/')

itu menempatkan informasi baru di awal (baik, kedua, tepatnya) dari urutan pencarian yang akan dilalui oleh penerjemah Anda. sys.path.append() menempatkan hal-hal di bagian paling akhir dari urutan pencarian.

Anda disarankan menggunakan sesuatu seperti itu virtualenv alih-alih secara manual mengkode direktori paket Anda ke dalam PYTHONPATH setiap saat. untuk menyiapkan berbagai ekosistem yang memisahkan paket situs Anda dan kemungkinan versi python, baca dua blog ini:

  1. pengantar ekosistem python

  2. bootstrapping lingkungan virtual python

jika Anda memutuskan untuk pindah jalur ke isolasi lingkungan Anda pasti akan mendapat manfaat dengan melihat ke virtualenvwrapper: http://www.doughellmann.com/docs/virtualenvwrapper/


12
2018-06-24 18:01