Python programlarını nasıl dağıtabilirim?


102

Başvurum şuna benziyor:

main.py
pencereler/
    __init__.py
    mainwindow.py
    ...
model /
    __init__.py
    orders.py
    ...
kaynaklar /
    image1.png
    logo.jpg
    ...

Program main.py ile başlatılır. Bundan 'nihai' bir uygulama oluşturmanın iyi bir yolu var mı? Py2exe / py2app gibi bir şey düşünüyorum, ancak python yorumlayıcısını / modüllerini tek bir yürütülebilir dosyanın bulunduğu uygulamaya kopyalamadan.

Dağıtımlara bir göz attım, ancak bu, Linux olmayan platformlarda olağan olmayan Python dizinine bir program yüklüyor gibi görünüyor.

Şu anda tüm kaynak klasörü hedef makineye kopyalıyorum ve main.pywwindows üzerinde bir takma ad oluşturuyorum . Bazı rahatsızlıklar:

  • Simge, varsayılan python simgesidir.
  • Takma adı manuel olarak oluşturmam gerekiyor.
  • Kaynak dizinimde kaynak denetim klasörü gibi birçok ek dosya var.
  • El ile olarak yeniden adlandırmam main.pygerekiyor main.pyw.
  • Hedef makinede yalnızca ".pyo * dosyalarının olması iyi olur. Bunun gerçek bir nedeni yok, sadece gereksiz dosyalara sahip olmaktan hoşlanmıyorum.

Güzel bir otomatik dağıtım nasıl oluşturulur?

  • pencereler için? (Şu anda desteklemem gereken tek platform bu.)
  • Mac için?
  • linux için?

2
"Dağıtımlara bir göz attım, ancak bu, Linux olmayan platformlarda normal olmayan Python dizinine bir program yüklüyor gibi görünüyor." Bunu neden söylüyorsunuz? Bunu söyleyen hangi metni okudun? Kesinlikle doğru değil, bu izlenimi nereden aldınız?
S.Lott


Yanıtlar:


37

Python uygulamaları dağıtmak normal yolu ile distutils . Windows'ta nasıl çalıştığını bilmesem de, hem kitaplık türü python modüllerini hem de python uygulamalarını dağıtmak için yapılmıştır. Her durumda, Windows'ta dağıtım kullanıyorsanız, Python'u ayrı olarak yüklemeniz gerekir.

Muhtemelen onu Linux için disutils ve Py2exe veya Windows için benzer bir şeyle dağıtmanızı tavsiye ederim. OS XI için bilmiyorum. Bu bir son kullanıcı uygulamasıysa, muhtemelen disk görüntüsü türünde bir şey istersiniz, bunu nasıl yapacağımı bilmiyorum. Ancak , kullanıcı deneyimi hakkında daha fazla bilgi için bu yazıyı okuyun . Programcılar için yapılmış bir uygulama için, OS X'e de distutils türü yüklemede muhtemelen sorun yoktur.


1
Mac ve linux şu anda o kadar önemli değil. Py2app, .app paketleri oluşturur. Ve bence mac uygulamalarını .dmg olarak göndermenin modası geçmiş, biri .zip kullanmalı. Distutils'i sadece bir dizin oluşturmak distve ilgili tüm dosyaları buna kopyalamak için kullanmak mümkün mü ?
Georg Schölly

1
@gs: sdist komutu tüm kaynak dosyalardan bir tar dosyası oluşturacaktır.
Martin / Löwis

5
@gs: Mac uygulamalarını .dmg olarak göndermek aslında oldukça yaygındır. .dmg'ler disk resimleridir ve uygulamalar için bir format değildir (yani .app olacaktır). Bu nedenle, genellikle bir .dmg içinde tek bir .app ve bazı README dosyasıyla birlikte bulursunuz.
Eric O Lebigot

3
@gs Neden dağıtımların sadece bir dizin oluşturmasını ve dosyaları oraya kopyalamasını istediğinizi bilmiyorum, bunu kendiniz yapabilirsiniz. Distutils, Windows yükleyicileri yapmak dahil pek çok şey yapar ve Python 2.6'dan Başlat menüsünde bağlantılar da oluşturur. Yine de Python'u ayrı olarak yüklemenizi gerektirecek, bu nedenle bir son kullanıcı uygulaması için py2exe'nin daha iyi bir çözüm olduğunu düşünüyorum çünkü kendi Python'unu içeriyor. OS X için nakliye / yükleyiciler, Alexander Limi tarafından blog yazısında ayrıntılı olarak tartışılıyor, bu yüzden ona saygı duyuyorum.
Lennart Regebro


61

Tüm büyük platformları oldukça sorunsuz bir şekilde destekleyen Pyinstaller'ı şiddetle tavsiye ediyorum . Py2exe ve py2app gibi, Windows'ta standart bir yürütülebilir dosya ve OS X'te bir uygulama paketi üretir, ancak aynı zamanda ortak bağımlılıkları otomatik olarak çözme ve bunları ekstra yapılandırma ayarlamaları olmadan dahil etme gibi harika bir iş yapma avantajına sahiptir.

Ayrıca Python 2.6'yı Windows'a dağıtıyorsanız, bu yamayı Pyinstaller gövdesine uygulamalısınız.

Bir yükleyiciye ihtiyacınız olmadığını belirttiniz, ancak Inno Setup , Windows platformu için kullanımı kolay ve kurulumu hızlı bir seçimdir.


3
Aşırı olduğundan emin değilim. Bir uygulamayı Pyinstaller ile paketlemek aslında diğer yöntemlerden, özellikle c uzantılarına bağımlı olanlardan daha kolay olabilir ... çoğu durumda tek satırlık bir komut satırı çağrısı kadar basit. Python + bağımlılıklarını + uygulamanın kendisinin (ister dağıtımlar vb. Aracılığıyla ister sadece bir zip dosyası aracılığıyla) yüklenmesi, özellikle geliştiricinin hedef makineyi manuel olarak yapılandıramaması ve istemciye talimatlar vermesi gerekiyorsa daha fazla işin içine girer. En azından Windows'ta bu dağıtım tarzının mantıklı olduğunu düşünüyorum.
Daniel Naab

1
Pyinstaller ile biraz sakıncalı, pyinstaller ile oluşturulan yürütülebilir dosyayı kullandığınızda, yürütmenin başlangıcı birkaç saniye sürer.
JuanPablo

1
Tam olarak aradığım şey. Bazen komut dosyalarımın hiçbir şey yükleyemediğim bilgisayarlarda çalışmasına izin vermem gerekiyor. Harici bağımlılıkları olmayan tek bir yürütülebilir dosya ihtiyacım olan şey. Başlangıç ​​için birkaç saniye ayırabilirim. Teşekkür ederim!
CodeMonkey

Basit bir Hello worldprogram 500MB alan ve 3-5 saniye başlatma süresi alacağı için küçük uygulamalar için önerilmez .
Raf

Uygulamanızı dağıtmak için ayrı bir ortam kullanarak bu miktardaki alanı önleyebilirsiniz (örneğin, venv veya pyenv kullanarak)
Alexander Santos

4

Fredrik Lundh'lar squeeze.pyPython yorumlayıcısını içermeyen, bunun yerine bayt kodunu içeren tek bir dosya oluşturabilir. Doğru bağımsız değişkenlerle, sonuç dosyasına başka dosyalar, modüller vb. Ekleyebilirsiniz. Tek bir projede başarıyla kullandım. Ortaya çıkan program OS X, Linux ve Windows üzerinde sorunsuz bir şekilde çalıştı!

Not : Her makinenin squeeze.py tarafından oluşturulan bayt koduyla uyumlu bir Python yorumlayıcısına sahip olması gerekir. Gerekirse, farklı Python sürümleri için farklı bayt kodu sürümleri oluşturabilirsiniz (sadece Python'un doğru sürümüyle squeeze.py'yi çalıştırın).


4

Bence PEX'ten de bahsetmeye değer (bu sorunun daha fazla ilgi görmesi ve sorunun kendisi daha az dikkate alınması). Onun göre kendi açıklaması :

PEX dosyaları, kendi kendine yeten çalıştırılabilir Python sanal ortamlarıdır. Daha spesifik olarak, PEX çalışma zamanı ile etkileşim kurmanıza izin veren bir #!/usr/bin/env pythonve özel ile dikkatlice oluşturulmuş zip dosyalarıdır __main__.py. Zip uygulamaları hakkında daha fazla bilgi için bkz. PEP 441 .

Python için paketlemeye genel bir bakış okuduğumda tökezledim . Bu güzel resmi oraya gönderdiler: görüntü açıklamasını buraya girin

Özetlemek gerekirse: Hedef makineye Python kurulmasına güvenmeyi göze alabiliyorsanız, örneğin PyInstaller tarafından üretilen bir yürütülebilir dosyadan muhtemelen daha küçük dosya boyutuna sahip olan kendi kendini içeren bir »çalıştırılabilir" üretmek için PEX kullanın.



1

Windows üzerinde dağıtım yapıyorsanız , gerekli olan tüm ilgili dosyaları / yorumlayıcıyı kurmak için bir yükleyici kullanın. Bir setup.exe dosyasını dağıtın. Pencerelerde en iyi yol budur. Aksi takdirde kullanıcılar şikayet edecek.


1
Bir yükleyiciye ihtiyacım yok çünkü programı kullanacak tek bir kullanıcı var. Ancak, daha fazla kullanıcı için bir program yazarken, pencerelerde olması gereken bir şey.
Georg Schölly

1
@gs: Oh, sadece bir kullanıcı. Tamam, o zaman temel bir dağıtım paketi, bir kaynak dağıtımı veya bir Windows ikili yükleyicisi yapmanızı öneririm. Bu kesinlikle bir Python modülünü dağıtmanın kolay ve güzel bir yoludur.
Lennart Regebro

0

Python masaüstü uygulamalarını dağıtmanın en uygun * çapraz platform yolu, platformlar arası conda paket yöneticisine güvenmektir. Bunu kullanan birkaç araç var:

  • Miniconda-Install - Miniconda'yı otomatik olarak indiren ve uygulama için yalıtılmış conda ortamı oluşturan powershell / bash betikleri. Pip'i destekler, ancak bakıma alınmamış gibi görünür ve https indirme sorunları vardır.
  • Anaconda ProjesiContinuum tarafından ve (conda) kurucusu . Her ikisi de conda kullanır. (conda) yapıcısı, Windows'ta kendi kendine yeten yükleyiciler ve hatta NSIS yükleyici oluşturabilir gibi görünüyor, ancak pip'i desteklemiyor. Anaconda / Miniconda yükleyicileri gibi davranıyor gibi görünüyor.
  • PyAppShare - son kullanıcı önce Miniconda / Anaconda'yı kurar (çalışma zamanı ortamı gibi). Daha sonra tek yükleme batch / bash betiği, yaml spesifikasyonundan yalıtılmış bir conda ortamı oluşturur. Uygulama aynı zamanda ortama yüklenen ve çalıştırılabilir bir giriş noktası oluşturulan bir conda / pip paketidir. Çapraz platform Masaüstü ve Programlar kısayolları otomatik olarak oluşturulur. Ortamı etkinleştirirler ve uygulamayı başlatırlar. Pip destekler.

* Geliştirici için en uygun olanı. Son kullanıcı için yeterince uygun.

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.