Bir Python uygulamasını bağımlılıklarıyla paketleme
Web ajansı » Dijital haberler » Bir Python uygulamasını bağımlılıklarıyla paketleme

Bir Python uygulamasını bağımlılıklarıyla paketleme

Bir süre önce Python'da bir uygulama geliştirdim. Bağlamı ayarlamak, konuşlandırabilen bir yürütülebilir dosya oluşturmakla ilgiliydi. liman işçisi-compose.yml iş kurallarını uygulayarak. Her şeyi yeniden yazmamak için bir proje oluşturdum. Python kütüphaneyi kullanabilmek liman işçisi-oluşturma ki bu da Python'da. İşlevsel hale geldiğinde uygulamamın tek bir dosyada oluşturulması gerekiyordu. amacım tüm bağımlılıklarını içeren bir ikili dosya oluşturun (biraz Golang gibi).

Dikkat ! Bir ikili dosya oluşturmak, Python'u makinenize kurmaktan sizi muaf tutmaz. İkili dosya derlenmiş bir uygulama değil, sadece bir pakettir.

mimari

İlk önce bir klasör oluşturacaksınız filanca projenizde Bu, tüm çalışmalarınızı içerecektir.

1
2
3
4
5
6
proje
|_ __ana__.py
|_ foobar
|_ __init__.py
|_ __ana__.py
|_cli.py

Bu makaleye rastladıysanız, Python'u en az benim kadar iyi bildiğiniz ve bu nedenle bağımlılıkları global olarak veya bir ağda nasıl kuracağınızı bildiğiniz anlamına gelir. virtualenv.

Kişisel olarak geliştirmelerimi bir Docker-konteyner bu yüzden bağımlılıklarımı global olarak kuruyorum.

Bir bağımlılığın nasıl kurulacağı aşağıda açıklanmıştır.

1
$ pip docopt yükleyin

Ardından dosyanız üzerinde çalışabilirsiniz. kli.py. İşte kütüphanenin kullanımına bir örnek belge.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
# proje/foobar/cli.py
itibaren belge ithalat belge
versiyon= "1.0.0"
yardım= « » »Foobar
Kullanımı:
foobar versiyonu
Seçenekler:
-h --help Yardımı göster
Foobar, Baptiste Donaux tarafından geliştirilen sahte bir açık kaynaklı projedir.
"" "
def ana():
bağımsız değişkenler = docopt(yardım)
if argümanlar[" versiyon "]:
Yazdır(“foobar versiyonu”, sürüm)

Gelişmekte olan uygulamayı başlatmak için bir dosyaya ihtiyaç duyulacaktır (benim durumumda __init__.py boş ama gerekli bir dosyadır).

1
2
3
4
5
6
# proje/foobar/__main__.py
itibaren . ithalat cli
if __isim__ == " __el__ ":
cl.main()

Bir ikili paket oluşturmak için bir giriş noktasına (proje/__main__.py).

1
2
3
4
5
6
# proje/__main__.py
itibaren filanca ithalat cli
if __isim__ == " __el__ ":
cl.main()

Artık uygulamanızı kolayca çalıştırabilirsiniz.

1
2
$ piton ./foobar/ versiyon
("foobar versiyonu", '1.0.0')

Statik bir ikili dosya oluşturun

İş Akışı

Temiz bir projeden (bağımlılık olmadan…), işte gerçekleştirilecek adımlar.

  • Oluşturmak için virtualenv ve etkinleştir
  • Bağımlılıkları yükleyin ve çıkın virtualenv
  • içinde bulunan dosya ve klasörleri silin. virtualenvBir klasöre karşılık gelen /lib/python2.7/sites-packages bip, bir önbellek klasörü, derlenmiş dosyalara veya bilgi dosyalarına.
  • Son dosyayı oluşturmak için bir klasör oluşturun
  • Bağımlılıkları, kaynakları ve girdi dosyasını yeni oluşturulan klasöre kopyalayın.
  • Sıkıştırılmış bir klasör oluşturun (.zip) derleme klasörünün içeriği.
  • Ortamı belirtmek için bir başlığa sahip “ikili” dosyayı oluşturun ve bu dosyaya sıkıştırılmış klasörün içeriğini ekleyin.

Hardcore

İşte izlenecek teknik adımlar.

1
2
3
4
5
6
7
8
9
10
11
12
$ virtualenv bağımlılıkları
$. ./bağımlılıklar/bin/etkinleştir
$ pip docopt yükleyin
$ devre dışı bırak
$ rm -rf $(./dependencies/lib/python2.7/site-packages -print'i bulun | egrep '(/pip/)|(__pycache__)|(.(pyc|dist-info|so)$)')
$ mkdir yapı
$ cp -R ./bağımlılıklar/lib/python2.7/site-packages/* ./foobar ./__main__.py ./build/
$ cd ./inşa etmek
$ zip -r ../release.zip *
$ kaçırmak '#!/usr/bin/env piton' > ../bırak
$ cat ../release.zip >> ../release
$ chmod +x ../bırak

Sonuç

Artık ikili dosyanızı kolayca çalıştırabilirsiniz. Tüm bağlamını içine alır.

1
2
$ ./sürüm sürümü
("foobar versiyonu", '1.0.0')

Bu çözüm, bir uygulamayı tek bir dosyayla dağıtmam için çok uygun oldu. Gösterimi çoğaltmak için örnek dosya arşivini indirebilirsiniz.

★ ★ ★ ★ ★