Neden sys.path.insert (1, yol) yerine sys.path.append (yol) kullanılıyor?


89

Düzenleme: Ulf Rompe'un yorumuna göre, "0" yerine "1" kullanmanız önemlidir , aksi takdirde sys.path'i bozarsınız .

Uzun bir süredir python yapıyorum (bir yıldan fazla) ve insanların neden sys.path.append()bunun yerine kullanmanızı önerdiği konusunda kafam hep karıştı sys.path.insert(). Göstermeme izin verin.

Diyelim ki PyWorkbooks adında bir modül (bilgisayarımda kurulu olan) üzerinde çalışıyorum, ancak aynı anda PyWorkbooks'u içeren farklı bir modül (diyelim ki PyJob) üzerinde çalışıyorum. PyJob üzerinde çalışırken, PyWorkbooks'ta düzelttiğim hatalar buluyorum, bu yüzden bir geliştirme sürümünü içe aktarmak istiyorum.

Her ikisinde de çalışmanın birden fazla yolu vardır (örneğin, PyWorkbooks projemi PyJob'un içine koyabilirim), ancak bazen yine de yolla oynamam gerekecek. Ancak, PyWorkbooks'un bulunduğu klasöre basitçe a sys.path.append()yapamam . Neden? Çünkü python önce yüklü PyWorkbook'larımı bulacak!

Bu nedenle bir sys.path.insert (1, path_to_dev_pyworkbooks) yapmanız gerekiyor

Özetle:

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

veya:

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

Bu, geçmişte benim için birkaç soruna neden oldu ve biz (bir topluluk olarak) sys.path.insert(1, path), sanki manuel olarak bir yol ekliyormuşsunuz gibi önermeye başlasaydık , bunun istediğiniz yolun bu olduğunu söylemenin güvenli olduğunu düşünüyorum. kullanmak!

Yoksa yanlış bir şey mi var? Bu bazen beni rahatsız eden bir soru ve açıktan istedim!


3
Yaptım sys.path.insert(1, dev_folder)ama hala dev modülünü bulamıyor ve sadece kurulu modülü kullanıyor. Bunu nasıl düzeltirim?
endolith

Yanıtlar:


47

Bir paketin / modülün birden fazla sürümüne sahipseniz, virtualenv kullanmanız gerekir (vurgu benim):

virtualenv izole Python ortamları oluşturmak için bir araçtır.

Ele alınan temel sorun, bağımlılıklar ve sürümlerden biri ve dolaylı olarak izinlerdir. LibFoo'nun 1. versiyonuna ihtiyaç duyan bir uygulamanız olduğunu, ancak başka bir uygulamanın 2. versiyonunu gerektirdiğini hayal edin. Bu iki uygulamayı nasıl kullanabilirsiniz? Her şeyi /usr/lib/python2.7/site-packages(veya platformunuzun standart konumu ne olursa olsun) içine yüklerseniz , yükseltilmemesi gereken bir uygulamayı istemeden yükselttiğiniz bir duruma düşmek kolaydır.

Ya da daha genel olarak, bir uygulamayı yükleyip öyle bırakmak isterseniz ne olur ? Bir uygulama çalışırsa, kitaplıklarındaki veya bu kitaplıkların sürümlerindeki herhangi bir değişiklik uygulamayı bozabilir.

Ayrıca, paketleri global site-packagesdizine kuramazsanız ne olur ? Örneğin, paylaşılan bir ana bilgisayarda.

Tüm bu durumlarda virtualenvsize yardımcı olabilir. Kendi kurulum dizinlerine sahip, kitaplıkları diğer virtualenv ortamlarıyla paylaşmayan (ve isteğe bağlı olarak genel olarak yüklenmiş kitaplıklara da erişmeyen) bir ortam oluşturur.

İşte bu yüzden insanlar insert(0, yanlış olduğunu düşünüyor - bu, birden çok ortamı yönetme sorununa eksik, geçici bir çözüm.


Teşekkürler, bunun gibi bir şeyin var olduğunu belli belirsiz biliyordum ama şimdiye kadar kontrol etmedim. Yani bununla yapmam gereken şey, tercümandan her şeyi sanal ortamda çalıştırmaktır ... bu da işe yarayabilir. Teşekkürler!
Garrett Berg

1
Bu bir öneridir ancak doğrudan soruya cevap vermez (örneğin ben kullanmak zorunda bırakmaz nedenleri var virtualenvaslında ve OP ilişkili cevabını arıyorum)
StephenBoesch

@javadba Bu sizin durumunuz için doğru olabilir, ancak bu soruyu soran çoğu insan kullanıyor olmalı venv.
agf

46

Gerçekten sys.path.insert kullanmanız gerekiyorsa, sys.path [0] 'ı olduğu gibi bırakmayı düşünün:

sys.path.insert(1, path_to_dev_pyworkbooks)

Üçüncü taraf kodu sys.path dokümantasyon uyumluluğuna bağlı olabileceğinden bu önemli olabilir :

Program başlangıcında başlatıldığı gibi, bu listenin ilk öğesi olan yol [0], Python yorumlayıcısını çağırmak için kullanılan betiği içeren dizindir.


13

ekleme ve ön harcama kavramlarını karıştırıyorsunuz. aşağıdaki kod başa ekleniyor:

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

yeni bilgiyi, tercümanınızın geçeceği arama dizisinin başlangıcına (tam olarak ikinci olarak) yerleştirir. sys.path.append()her şeyi arama dizisinin en sonuna yerleştirir.

virtualenvpaket dizinlerinizi PYTHONPATHher seferinde manuel olarak kodlamak yerine, benzeri bir şey kullanmanız önerilir . site paketlerinizi ve olası python sürümlerini ayıran çeşitli ekosistemler kurmak için şu iki blogu okuyun:

  1. python ekosistemlerine giriş

  2. önyükleme python sanal ortamları

Ortam izolasyonu yolunda ilerlemeye karar verirseniz, virtualenvwrapper'a bakarak kesinlikle fayda sağlayabilirsiniz: http://www.doughellmann.com/docs/virtualenvwrapper/


1
"Python ekosistemlerine giriş", "önyükleme python sanal ortamları" bağlantıları kullanımdan kaldırıldı, lütfen bunları yeniden canlandırmayı düşünün.
Pradeep Singh
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.