Başkalarının python programımı çalıştırabilmesini sağlamanın sağlam yolu


17

GitHub'a bir python programı yerleştirmek ve başkalarının çeşitli işletim sistemleri ile bilgisayarlarında indirmesini ve çalıştırmasını istiyorum. Python için nispeten yeniyim, ancak birlikte çalışacak tüm modüllerin çeşitli sürümlerinin birlikte çalışmasının sorunlu olabileceğini fark etmek için yeterince kullandım. Ben sadece requirements.txt( pipreqskomut ile oluşturulan ve komut ile oluşturulan) kullanımını keşfettim pip install -r /path/to/requirements.txtama requirements.txtaslında hangi python sürümünün kullanıldığını belirtmediğini fark etmek çok şaşırdım, bu yüzden kendi başına tam bir çözüm değil. Benim sorum şu: projemi indiren birisinin onu mümkün olan en az sorunla çalıştırabilmesi için hangi özellik / dosya / başka bir şey gerekli.

DÜZENLEME: Planım hangi cevap en çok oy aldı? Ancak şimdiye kadar, 4 cevap ve 127 görüntülemeden sonra, tek bir cevabın bile bir oyu yok. Cevapların bazıları iyi değilse, neden iyi olmadıklarına dair bazı yorumları görmek faydalı olacaktır .


1
olası en az sorun için Docker'ı (veya diğer kap tabanlı çözümleri) düşündünüz mü? docker.com
Ramzi

Re: Docker ... Şunu buldum: "geliştirici uygulamanın herhangi bir Linux makinesinde çalışacağından emin olabilir" - ancak bunun herhangi bir işletim sisteminde çalışmasını istiyorum. ( opensource.com/resources/what-docker )
Mick

Normalde tüm klasik işletim sistemleri için desteğiniz vardır: Windows ( docs.docker.com/docker-for-windows ) ve mac ( docs.docker.com/docker-for-windows )
Ramzi

2
Bu sorunun cevabı son derece içeriksel. Python programı sysya osda alt işlem tipi fonksiyonlar ya da daha fazla matematiksel / analitik işler yapıyor mu? Birincisi her Python sürümü ile değişebilir ve daha sonra sürümden bağımsız olabilir. Hangi bağımlı kütüphaneler? numpy ve pandalar platformlar arasında inanılmaz bir iş yaparlar, böylece min sürümünüz olup olmadığını kontrol edebilirsiniz. Python'un hangi ana sürümü? Bağımlı kütüphanelerle Python 2.x ve 3.x arasındaki fark daha da zorlaşıyor. Eğer ortak bir büyük sürümü hedefleyen iyi bir kod yazarsanız, bu harika bir başlangıçtır.
dawg

2
Sayısız cevap tarafından kanıtlandığı gibi, bu konuda pek çok yol var. Uygulamanın ne olduğunu bilerek cevapların değişip değişmeyeceğini gerçekten merak ediyorum . Bunun önemli olmaması gerektiğine inanmak isterim, ancak olabileceğinden şüpheleniyorum. Ben de bunun hedef kitleye bağlı olduğunu düşünüyorum. Savvy fizik doktora dama bir pygame oynayan bir makine öğrenme uygulaması çalışan doktora.
Marcel Wilson

Yanıtlar:


15

Bir setup.pydosya oluşturmayı düşündünüz mü ? Tüm kurulumunuzu tek bir yerde bir araya getirmenin kullanışlı bir yoludur. Böylece tüm kullanıcı yapmanız gereken A) repo klonlamak ve B) çalıştırmak pip install .için çalıştırmaksetup.py

Bu konuda büyük bir yığın tartışması var.

Yanı sıra istekleri adam tarafından yazılmış bir tanıtıcı örneği.

Bu, çoğu kullanım durumunu kapsamalıdır. Şimdi gerçekten dağıtılabilir hale getirmek istiyorsanız , resmi dağıtım merkezi olan PyPi'de kurmak isteyeceksiniz .

Bunun ötesinde, bir programı "İşletim Sisteminden bağımsız" nasıl yapacağınızı soruyorsanız, herkese uyan tek bir boyut yoktur. Bu, kodunuzla ne yaptığınıza bağlıdır. Özel kodunuzun bu işletim sistemleriyle nasıl etkileşime girdiğini araştırmayı gerektirir.


7

Bunu yapmanın birçok, çok, çok, çok, çok, çok, çok yolu vardır. Her birinin arkasındaki prensipleri gözden geçireceğim ve kullanım durumu.

1. Bir python ortamı

Bunu yapmanın birçok yolu var. pipenv, conda, requirments.txtvb.

Bunlardan bazılarıyla python sürümlerini belirleyebilirsiniz. Diğerleri ile birlikte çalıştığını bildiğiniz bir dizi python sürümünü belirtin - örneğin, python 3.7 kullanıyorsanız, 3.6'yı desteklememesi olası değildir; sadece bir veya iki küçük değişiklik var. 3.8 de çalışmalıdır.

Başka bir benzer yöntem setup.py. Bunlar genellikle içe aktarma / komut satırı kullanımı için PyInstaller (aşağıda bahsedeceğim başka bir çözüm) veya numpy veya wxPython veya PyQt5 vb. Gibi kitaplıkları dağıtmak için kullanılır. Python paketleme kılavuzu oldukça kullanışlıdır ve orada bir sürü öğretici vardır. (google python setup.py tutorial) Bu dosyalarda da gereksinimler belirleyebilirsiniz.

2. Bir kap

Docker büyük olanı. Eğer duymadıysan, şaşıracağım. Bir özet Hızlı google ile geliyor bu ben bir kısmını teklif edeceğiz, hangi:

Peki neden herkes kapları ve Docker'ı seviyor? Daha önce Parallels'in sunucu sanallaştırma CTO'su ve önde gelen Linux çekirdek geliştiricisi olan James Bottomley, Hyper-V, KVM ve Xen gibi VM hipervizörlerinin hepsinin "sanal donanımı taklit etmeye dayalı olduğunu" açıkladı. sistem gereksinimleri."

Ancak kapsayıcılar paylaşılan işletim sistemleri kullanır. Bu, sistem kaynağı açısından hipervizörlerden çok daha verimli oldukları anlamına gelir. Donanımı sanallaştırmak yerine, kapsayıcılar tek bir Linux örneğinin üstünde durur. Bu, "% 99,9 oranında gereksiz önemsiz VM önemsizliğini geride bırakıp sizi uygulamanızı içeren küçük, temiz bir kapsülle bırakabileceğiniz" anlamına gelir.

Bu sizin için özetlemelidir. (Kapsayıcılar için belirli bir işletim sistemine ihtiyacınız olmadığını unutmayın.)

3. Yürütülebilir bir dosya

Yazarken bunu yapan 2 ana araç vardır. PyInstaller ve cx_Freeze. Her ikisi de aktif olarak geliştirildi. Her ikisi de açık kaynak.

Komut dosyanızı alırsınız ve araç onu bayt kodla derler, içe aktarmaları bulur, kopyalar ve son kullanıcının python'a ihtiyaç duymadan komut dosyanızı hedef sistemde çalıştıran taşınabilir bir python ortamı oluşturur.

Şahsen, PyInstaller'ı tercih ediyorum - geliştiricilerden biriyim. PyInstaller tüm işlevlerini bir komut satırı komut dosyası aracılığıyla sağlar ve aklınıza gelebilecek çoğu kütüphaneyi destekler - ve daha fazlasını desteklemek için genişletilebilir. cx_Freeze bir kurulum betiği gerektirir.

Her iki araç da windows, Linux, macOS ve daha fazlasını destekler. PyInstaller tek dosya exes veya bir klasör paketi oluşturabilir, cx_Freeze ise sadece bir klasör paketini destekler. PyInstaller 3.6, python 2.7 ve 3.5-3.7'yi destekler - ancak 4.0 , python 2'yi desteklemez. Cx_Freeze, son büyük sürümden (6.0 sanırım) python 2 desteğini düşürdü.

Her neyse, araçların özellikleri hakkında yeterli; bunlara kendiniz bakabilirsiniz. (Daha fazla bilgi için https://pyinstaller.org ve https://cx-freeze.readthedocs.io adresine bakın )

Bu dağıtım yöntemini kullanırken, GitHub deposunda genellikle kaynak kodu, indirilmeye hazır birkaç exes (her platform için bir tane) ve kodun yürütülebilir bir dosyada nasıl oluşturulacağına ilişkin talimatlar sağlarsınız.


1

Bunun için şimdiye kadar kullandığım en iyi araç Pipenv . Sadece pip + virtualenv iş akışını sizin için geliştirir, basitleştirmez, aynı zamanda diğer insanlar projenizi onunla birlikte çalıştırdığında tüm bağımlılıkların (Python'un kendisi de dahil) tam sürümlerinin karşılandığını garanti eder .

Proje web sitesi, aracın nasıl kullanılacağını açıklamak konusunda oldukça iyi bir iş çıkarıyor, ancak tamlık uğruna, burada kısa bir açıklama yapacağım.

Pipenv kurulduktan sonra (örneğin çalıştırarak pip install --user pipenv), projenizin dizinine gidip çalıştırabilirsiniz pipenv --python 3.7, böylece Pipenv projeniz için yeni bir sanalenv yaratır, Pipfile ve Pipfile.lock oluşturur (daha sonra daha fazla) . Devam edip çalıştırırsanız pipenv install -r requirements.txttüm paketlerinizi yükleyecektir. Artık pipenv shellyeni virtualenv'inizi etkinleştirmek için a veya pipenv run your_main_file.pyprojenizi çalıştırmak için a yapabilirsiniz.

Şimdi Pipfile'nizin içeriğine bir göz atalım. Buna benzeyen bir şey olmalı:

[packages]
Django = "*"
djangorestframework = "*"
iso8601 = "*"
graypy = "*"
whitenoise = "*"

[requires]
python_version = "3.7"

Bu dosya, projenizin bağımlılıkları için okunabilir özelliklere sahiptir (Python sürümünü de belirttiğini unutmayın). Gereksinimleri.txt sabitlenmiş sürümleri olsaydı, Pipfile onları da olabilir, ancak kesin sürümleri Pipfile.lock saklandığı için güvenle joker olabilir. Artık pipenv updatebağımlılıklarınızı güncellemek gibi şeyleri çalıştırabilir ve VCS'nize Pipfile ve Pipfile.lock işlemlerini yapmayı unutmayın.

İnsanlar projenizi klonladıktan sonra, tek yapmaları gereken çalışır pipenv installve Pipenv gerisini halleder (hatta onlar için doğru Python sürümünü yükleyebilir).

Umarım faydalı olmuştur. Pipenv ile hiçbir şekilde bağlantılı değilim, sadece bu harika aracı paylaşmak istedim.


1

Programınız GUI hakkında daha azsa veya bir web GUI'sine sahipse, kodu Google Colaboratory'yi kullanarak paylaşabilirsiniz.

https://colab.research.google.com/

Herkes aynı ortamla çalıştırabilir. Kurulum gerektirmez.


1

Tüm python komut dosyalarınızı tek bir yürütülebilir dosyaya dönüştürmeniz size yardımcı olabilirse, aşağıdaki cevabım yardımcı olacaktır ...

3 yıldan beri tamamen python'da büyük bir masaüstü uygulaması geliştiriyorum. Pyqt kütüphanesinin (QT C ++ çerçevesinin python bağları) üzerine inşa edilmiş GUI tabanlı bir araçtır.

Şu anda " py2exe " paketleme kitaplığı kullanıyorum: Python komut dosyalarından bağımsız Windows yürütülebilir programlar (32 bit ve 64 bit) oluşturmanıza olanak tanıyan bir distutils uzantısıdır; tek yapmanız gereken:

  1. install py2exe: 'pip install py2exe'

  2. Bir setup.py betiği oluşturma: Son EXE'in içeriğini (ad, simge, yazar, veri dosyaları, paylaşılan kitaplıklar vb.) Belirtmek için kullanılır.

  3. Yürüt: python setup.py py2exe

Ayrıca yükleyici oluşturmak için "Inno Setup" yazılımını kullanıyorum : Kısayollar oluşturma, ortam değişkenleri, simgeler vb. Ayarlama ...


py2exe yıl olarak güncellenmedi. Son zamanlarda hiçbir etkinlik bulamıyorum . Öyleyse, bakıma beklemiyordum. (Ayrıca, yalnızca python <3.4'ü destekler. Bu, yalnızca kullanımdan kaldırılan python sürümlerini desteklediği anlamına gelir).
Legorooj


-1

Diğer cevaplardan eksik olduğu için, tamamen farklı bir yön eklemek istiyorum:

Birim testi. Ya da genel olarak test.

Genellikle, bilinen bir iyi yapılandırmaya sahip olmak iyidir. Programın bağımlılıklarına bağlı olarak, farklı paket kombinasyonlarını test etmeniz gerekebilir. Bunu, örneğin toxveya CI / CD boru hattının bir parçası olarak otomatik bir şekilde yapabilirsiniz .

Hangi paket kombinasyonunun test edilmesi gerektiğine dair genel bir kural yoktur, ancak genellikle python2 / 3 uyumluluğu büyük bir sorundur. Büyük sürüm farklılıklarına sahip paketlere güçlü bağımlılıklarınız varsa, bu farklı sürümlere karşı test etmeyi düşünebilirsiniz.


Bu, yazılım geliştirmenin çok önemli bir yönüdür. Ancak, bu soruya tamamen cevap vermez . Birim testi bir programın dağıtımına nasıl yardımcı olur?
Legorooj

IMHO, OP özellikle dağıtım hakkında soru sormuyor. Başkalarının programını yürütebileceğinden emin olmanın yollarını soruyor. İnsanların kullanılabilecek paketler kümesinde kısıtlanmış olabileceğinden, birim testlerinin aslında bunu yapmasına yardımcı olabileceğini düşünüyorum. Genel olarak dağıtım sorusu önemlidir (ve burada cevaplanmıştır), ancak gerçek dünya senaryosunda, sadece tek bir paket için tüm bir ven oluşturmaya güvenemeyiz - en azından bazı standart yapılandırmalarla uyumlu olması gerekiyor.
Dschoni

Birim testinin doğru çalıştığından emin olmak için değerli olduğunu tartışmıyorum , ancak OP kodu "kurulumu kolay" bir şekilde nasıl paylaşacağını sordu. Bu yüzden bu özel bir soru için bunun geçersiz bir cevap olduğunu düşünüyorum.
Legorooj

Sorunun hala sadece dağıtımla ilgili olmadığını düşünüyorum. Bu yüzden bu cevabı ekledim. Örneğin Windows üzerinde geliştiriyorsanız, dağıtımdan önce çalıştığından emin olmak istiyorsanız Unix üzerinde test yapmak önemlidir.
Dschoni

Meraktan, söylediğimden nasıl farklı? ... making sure it runs correctly ...? Test nedenle önemli bir parçası olduğunu, doğru çalışır emin önemli bir parçasıdır hazırlanıyor dağıtmak için, ama yine de aslında bir ilgisi olmadığını dağıtarak o
Legorooj

-1

Aralarından seçim yapabileceğiniz python ambalajlama söz konusu olduğunda mevcut çözümlerden bazılarının kısa bir özetini vereceğim (bilgi güçtür):

  1. Projenizi Yapılandırma'da verilen yönergeleri izleyin , bu sözleşmeler python topluluğu tarafından yaygın olarak kabul edilir ve yeni gelenler python'da kodlamaya başladığında genellikle iyi bir başlangıç ​​noktasıdır. Bu yönergeleri izleyerek, projenizi / kaynağınızı github'da veya diğer benzer yerlerde izleyen pitonistler hemen nasıl kurulacağını bileceklerdir. Ayrıca, projenizi pypi'ye yüklemek ve bu kuralları izleyerek CI eklemek ağrısız olacaktır.

  2. Projeniz standart kurallara göre düzgün bir şekilde yapılandırıldıktan sonra, bir sonraki adım mevcut bazı donduruculardan , son kullanıcılarınıza python'ları yüklemelerine zorlamadan yükleyebilecekleri bir paket göndermek isterseniz makineleri. Bu araçların size herhangi bir kod koruması sağlamayacağına dikkat edin ... aksi takdirde, orijinal eserlerden orijinal python kodunu çıkarmak her durumda önemsiz olacaktır

  3. Projenizi kullanıcılarınıza herhangi bir geliştirici bağımlılığı kurmaya zorlamadan göndermek istiyorsanız ve kod korumasına da önem veriyorsanız, mevcut dondurucuları dikkate almak istemiyorsanız, nuitka , shedskin , cython ya da benzeri. Genellikle bu araçların ürettiği eserlerden kodu tersine çevirmek hiç de kolay değildir ... Öte yandan çatlama koruması farklı bir konudur ve son kullanıcınıza fiziksel bir ikili sağlamadığınız sürece fazla bir şey yapamazsınız bu konuda onları yavaşlatmak dışında :)

  4. Ayrıca, python projenizde harici dilleri kullanmanız gerektiğinde, akla gelen başka bir klasik bağlantı https://wiki.python.org/moin/IntegratingPythonWithOtherLanguages , aşağıdaki gibi bu tür araçların derleme sistemlerini CI'ye ekleyebilir. 1 kuralı oldukça kolay olurdu.

Bununla birlikte, başlamanıza yetecek kadar iyi olacağını bildiğim için bulletpoint 1'e sadık kalmanızı öneririm, ayrıca bu nokta, python "standart" projeleri için mevcut kullanım durumlarının çoğunu kapsamalıdır.

Bu, bunları takip ederek tam bir rehber olması amaçlanmamış olsa da, python projenizi hiçbir zaman kitlelere yayınlayabileceksiniz.

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.