Kendi python modülümü içe aktarabilmek için nereye koymalıyım


89

Python'da kendi paketim var ve onu çok sık kullanıyorum. PYTHONPATH veya sys.path ile oynamadan içeri aktarılması için paketimi koymam gereken en zarif veya geleneksel dizin nedir?

Örneğin site paketleri ne olacak? /usr/lib/python2.7/site-packages.
Python'da paketi kopyalayıp buraya yapıştırmak yaygın mıdır?


1
Bağımlılıkları ve neyin kullanılmadığını söyleyen ve bunun daha iyi bir uygulama olduğunu ve daha taşınabilir olmasını sağlayan bir setup.py oluşturun ... ancak evet, genellikle kopyala / yapıştır iyi çalışır ... ancak genellikle "user / lib / "ya da başka bir şey ve hepsini oraya koyun ve sadece PYTHONPATH'ımda olduğundan emin olun
Joran Beasley

1
GERÇEK cevap: Kişisel basit komut dosyaları / dağıtılmamış paketler için, @JoranBeasley gibi diğer cevapları da sevmiyorum: Komut dosyalarınızı (veya bunlara bağlantıları) tutmak için bir klasör oluşturun ve bu klasörü bash'inizden PYTHONPATH'a ekleyin runcom ağacı (örneğin, komut dosyalarını / bağlantıları koyun , dosyanıza ~/foo/bar/ekleyin ). Bakın , bu manuel yol varsayılan python arama yolundan önce gelir. İsim çarpışmalarına dikkat edin. export PYTHONPATH=~/foo/bar # fields separated by ":"~/.bashrcman python

Yanıtlar:


64

İçe aktarmaya hazır olmasını istediğim şeyleri genellikle kullanıcı site dizinine koyarım:

~/.local/lib/pythonX.X/site-packages

Platformunuz için doğru dizini göstermek için kullanabilirsiniz python -m site --user-site


düzenleme: sys.patholuşturduğunuzda görünecektir:

mkdir -p "`python -m site --user-site`"

python'u bir terminalden açtığımda, bu sys.path'in verdiği şeydir. yerel ['', '/usr/lib64/python27.zip', '/usr/lib64/python2.7', '/usr/lib64/python2.7/plat-linux2', '/ usr / olmadığına dikkat edin lib64 / python2.7 / lib-tk ',' /usr/lib64/python2.7/lib-old ',' /usr/lib64/python2.7/lib-dynload ',' /usr/lib64/python2.7 / site-packages ',' /usr/lib64/python2.7/site-packages/PIL ',' /usr/lib64/python2.7/site-packages/gst-0.10 ',' / usr / lib64 / python2. 7 / site-packages / gtk-2.0 ',' /usr/lib/python2.7/site-packages ',' /usr/lib/python2.7/site-packages/setuptools-0.6c11-py2.7.egg
-info

bir komut dosyasını çalıştırırken verdiği şey budur ['/ home / kullanıcıadı / Masaüstü / mypackage / Örnekler', '/usr/lib64/python27.zip', '/usr/lib64/python2.7', '/ usr / lib64 /python2.7/plat-linux2 ',' /usr/lib64/python2.7/lib-tk ',' /usr/lib64/python2.7/lib-old ',' /usr/lib64/python2.7/ lib-dynload ',' /usr/lib64/python2.7/site-packages ',' /usr/lib64/python2.7/site-packages/PIL ',' /usr/lib64/python2.7/site-packages /gst-0.10 ',' /usr/lib64/python2.7/site-packages/gtk-2.0 ',' /usr/lib/python2.7/site-packages ',' /usr/lib/python2.7/ site-packages / setuptools-0.6c11-py2.7.egg-info ']
Cobry

python -m site --kullanıcı-site /home/username/.local/lib/python2.7/site-packages ancak bu sys.path arasında değil !!
Cobry

@Cobry python -m site --user-sitesize hangi dizini oluşturmanız gerektiğini söyleyecektir. sys.modulesSiz onu gerçekten yaratana kadar görünmez .
Aya

@mata Muhtemelen değişmelidir mkdiriçin mkdir -para dizinleri oluşturun. Bende bile yoktu ~/.local. ;-)
Aya

27

Yani benim gibi aceminiz ve dizinleriniz çok iyi organize edilmemişse bu yöntemi denemek isteyebilirsiniz.

Python terminalinizi açın. Benim durumumda numpy gibi çalıştığını bildiğiniz bir modülü içe aktarın ve aşağıdakileri yapın. Import numpy

numpy.__file__

hangi sonuçlanır

'/Library/Frameworks/Python.framework/Versions/3.4/lib/python3.4/site- packages/numpy/__init__.py'

Bunun sonucu numpy.__file__, python dosyasını modülünüzle birlikte koymanız gereken konumdur (hariç numpy/__init__.py), böylece benim için

/Library/Frameworks/Python.framework/Versions/3.4/lib/python3.4/site- packages

Bunu yapmak için terminalinize gidin ve yazın

mv "location of your module" "/Library/Frameworks/Python.framework/Versions/3.4/lib/python3.4/site- packages"

Artık modülünüzü içe aktarabilmelisiniz.


Python'umda nasıl oluyor da "._file_" çalışmıyor? >>> yeniden içe aktar >>> re._file_ Traceback (en son çağrı): Dosya "<pyshell # 10>", satır 1, <module> re._file_ AttributeError: modül 're' özniteliği yok ' dosyası '
Urso

3
@Urso İki alt çizgi kullandığınızdan emin misiniz? Komut re.__file__benim için çalıştı.
arie64

Böyle temiz bir çözüm için @ arie64 çok teşekkürler. Benim için de iyi çalıştı !!
Bms bharadwaj

Teşekkürler bu benim için de çalıştı. Ama tuhaf bir şekilde, modülümü gönderdiğim dizini / klasörü Dosya gezgininde bulamıyorum. Klasör yok gibi görünüyor. Klasörün olması gereken yerde neden görünmediğine dair herhangi bir fikriniz var mı? ("Gizli öğeleri göster" i etkinleştirdim, bu yüzden sadece bu değil ...)
Andre

7

Bu benim için çalışan bir şey (sık sık özel bir pip havuzuna yüklenen python paketleri oluşturmam gerekiyor). @joran'ın soru hakkındaki yorumunu detaylandırıyor.

  1. paketleri oluşturmak için bir çalışma alanı olarak kullanılan bir "yapı dizini" oluşturun. seçtiğiniz herhangi bir dizin işe yarar
  2. Python paketinizi oraya kopyalayın ve bir setup.py dosyası oluşturun. bu , setup.py'nin doğru şekilde oluşturulmasına yardımcı olacaktır.
  3. üzerinde çalıştığınız proje için bir virtualenv oluşturun . virtualenv'lerin bir dizi başka faydası var, burada ayrıntılara girmeyeceğim.
  4. yerel bir dağıtım paketi oluşturun python setup.py sdist --format=tar. oluşturulan paket ideal olarak distklasörde olmalıdır.
  5. Paketi virtualenv'inize kurun (etkinleştirdikten sonra). pip install <yourpackage>.tar

Kullanabileceğiniz pip install --force-reinstallsen kütüphaneler daha dist paketleri yeniden oluşturun uğraşmak gerekiyorsa.

Bu yöntemin benim için harika çalıştığını buldum. Modülleri sadece yerel sisteminiz yerine başka sistemlerin kullanımı için paketlemeniz gerekmiyorsa, bu yöntem aşırı olabilir

Mutlu hacklemeler.


1

Mac'imde bir sudo find / -name "site-packages". Bu bana gibi birkaç yollar verdi /Library/Python/2.6/site-packages, /Library/Python/2.7/site-packagesve /opt/X11/lib/python2.6/site-packages.

Bu yüzden, v2.7 veya v2.6 kullanıyorsam modüllerimi nereye koyacağımı biliyordum.

Umarım yardımcı olur.


1

içe aktarma klasörleri, aşağıdaki kaynak kodu eklenerek çıkarılabilir:

import sys
print sys.path

otomatik sembolik bağlantı oluşturma örneği şöyle olacaktır:

ln -s \`pip show em | grep "Location"| cut -d " " -f2\` \`python -m site --user-site\`

"em" yerine "yeni yüklediğiniz ancak python göremeyen" başka bir paketi kullanabilirsiniz

Aşağıda, yorumda talep edildiği gibi daha ayrıntılı olarak açıklayacağım.

aşağıdaki komutla python modülü em veya pyserial kurduğunuzu varsayalım (örnekler ubuntu içindir):

sudo pip install pyserial

ve çıktı şöyle:

Collecting pyserial
  Downloading pyserial-3.3-py2.py3-none-any.whl (189kB)
    100% |████████████████████████████████| 194kB 2.3MB/s 
Installing collected packages: pyserial
Successfully installed pyserial-3.3

soru şu olacaktır - python modülü fiziksel olarak göremiyor, neden? çünkü modülün kurulu olduğu konum, belirli kullanıcı hesabınız için python'un aradığı yer değildir.

çözüm - pyserial'ın python'unuzun aradığı yola ulaştığı yoldan symlink oluşturmalıyız.

symlink oluşturma komutu şöyle olacaktır:

ln -s <what_to_link> <where_to_link>

tam konumu yazmak yerine, pip'den modülleri nerede sakladığını komutunu çalıştırarak söylemesini istiyoruz:

pip show pyserial | grep "Location"| cut -d " " -f2

tam konumu yazmak yerine, python'dan, komutu çalıştırarak kurulmakta olan modülleri nerede aradığını söylemesini istiyoruz:

python -m site --user-site

her iki komutun da "` "karakteriyle öncelenmesi gerekir (genellikle ABD klavyeleri için 1 düğmenizin solundadır)

sonuç olarak ln için aşağıdaki komut sağlanacak ve eksik sembolik bağ oluşturulacaktır:

ln -s /usr/local/lib/python2.7/dist-packages /home/<your_username>/.local/lib/python2.7/site-packages 

veya benzer bir şey, dağıtımınıza ve python / pip varsayılanlarınıza bağlı olarak.


Güçlü bir tek satırlık gibi görünüyor ... Linux yeni başlayanlar için biraz açıklayabilir misiniz? İnsanlar anlamadıkları bir şeyi kullanmak konusunda temkinli olabilir :-)
pianoJames

-1

Bir modül geliştiriyorsanız, bunu takip etmenizi tavsiye ederim.

import sys
sys.path.append("/home/mylinux/python-packages")

Artık sakladığınız herhangi bir modül python-packagestarafından içe aktarılabilir Python-interpreter.

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.