Verkkosovelluksen muuttaminen työpöytäsovellukseksi käyttämällä Chromiumia ja PyInstalleria

Sovelluksen pakkaaminen ja jakelu kuulostaa periaatteessa yksinkertaiselta. Se on vain ohjelmisto. Mutta käytännössä se on melko haastavaa.

Olen työskennellyt Python-moduulin Sofi kanssa, joka tuottaa käyttöliittymiä. Se voi tarjota työpöydän tunnelman käytettäessä tavallisia yhden sivun verkkoteknologioita. Suunnittelin sen joustavuuden vuoksi toimimaan kahdella jakelumenetelmällä: selaimen sisäisellä ja suoritettavalla.

Suorita selaimessa, se toimii kuin tavallinen verkkosivu. Voit ladata sen avaamalla tiedoston tai käynnistämällä sen komentotulkista. Rakensin myös suoritettavan tiedoston, joka toimii pakattuna sovelluksena, itsenäisenä ja ilman ulkoisia vaatimuksia.

Ajan myötä, kun hakkeroin koodia Atomissa - valitsemani toimittajana näinä päivinä - muistin, että Atom on itse asiassa selain. Se käyttää Node.js: ää taustana ja Electron-kehystä käyttöliittymässään. Tämä innoitti minua aloittamaan tönäisi Electronin sisäosissa toivoen löytävänsä esimerkkejä ja parhaita käytäntöjä siitä, miten he ratkaisivat työpöydän pakkaukset.

Kesti kauan, kun huomasin, että kaikki on rakennettu ilmaisten ja avoimen lähdekoodin päälle: Chromium-selain ja Chromium Embedded Framework. Tämä sisälsi helposti integroitavia esimerkkimukautuksia, jotka pystyivät täyttämään vaatimukseni.

Kun kaikki tämä oli kädessä, sain töihin.

Chromium Embedded Framework

Chromium on peruskoodi, joka syöttää Googlen Chrome-selainta. Se yhdistää kaikki elementit, jotka tekevät käyttöliittymästä, käsittelevät käyttäjän syötteet ja komentosarjan toiminnot.

Chromium Embedded Framework (CEF) on joukko C-toimintoja, jotka voivat hallita kyseistä selainta. Se tarjoaa myös komentosarjoja, jotka yksinkertaistavat sen rakentamista ja kokoamista.

Visual Studio Code, Slack, Mattermost, Curse, Postman ja Kitematic ovat kaikki esimerkkejä työpöytäsovelluksista, jotka käyttävät Electronia. Nämä järjestelmät ovat kaikki verkkosivustoja, jotka hyödyntävät alla olevaa selainta CEF: n kanssa.

Jos ajattelet, että Python voi sitoutua C: hen ja hyödyntää myös näitä ominaisuuksia, olet oikeassa. Älä etsi pycef-projektia kutsuaksesi CEF-käärefunktiot suoraan. Sen mukana tulee kuitenkin kromi-binaarinen lisäriippuvuus. Joten jos olet huolissasi monimutkaisten tukilausekkeiden hallinnasta, mieti ennen kuin hyppäät.

Erityistilanteessani Sofi-projekti hallitsee kaikkia vuorovaikutuksia verkkopisteen kautta ja tarjoaa yhtenäisen käyttöliittymän erityyppisille alustoille (verkko, työpöytä, mobiili jne.). Tämä tarkoittaa, että minun ei tarvitse komentaa tai ajaa selainta manuaalisesti. Haluan olla vuorovaikutuksessa vain selaimen näyttämän DOM: in kanssa tavallisten verkkotekniikoiden avulla.

Tavoitteenani on mukauttaa käyttöliittymän elementtejä, jotka tekevät selaimesta näyttävän selaimelta. Minun täytyy poistaa valikot, työkalurivit ja tilarivit. Näin tehdessäni näyttää siltä, ​​että olemme koko näytön tilassa - mutta sovellusikkunassa.

Yksinkertaisten vaatimusteni takia minusta tuntui, että pycef - tai mikä tahansa muu alemman tason sidos - oli liikaa. Sen sijaan käytin hyväkseen CEF-projektin ennalta rakennettua otosta: cefsimple . Tämä selain piilottaa kaikki haluamasi visuaaliset elementit, joten jos käytän CLI: tä verkkosivun avaamiseen, käyttäjällä ei ole aavistustakaan, että he todella ovat selaimen sisällä. Se näyttää tavalliselta ikkunalta mistä tahansa sovelluksesta.

Cefsimplen rakentaminen ei ollut liian monimutkaista, kun kävin läpi dokumentaation. Mutta se vie valtavasti aikaa, jos rakennat myös Chromiumia sen mukana. Tämän välttämiseksi projekti itse tarjoaa valmiiksi rakennetut binääritiedostot, jotka voit mukauttaa ja koota cefsimpleksi. Minusta oli parasta hyödyntää näitä.

Vaiheet ovat seuraavat:

  1. Katso nopeasti, kuinka rakentaa CEF: llä binääreistä.
  2. Tartu repon binaarijakaumiin. Muista lukea työkaluvihjeet ennen kuin valitset yhden, koska kaikki paketit eivät sisällä samoja tiedostoja. Etsin nimenomaan yhtä cefsimple.
  3. Tarkista CMakeLists.txttiedosto ja varmista, että asennat tarvittavat rakennustyökalut. Tämä on alustakohtainen.
  4. Suorita koontiversio. Tämä selitetään samassa tiedostossa kuin edellinen vaihe ja on myös alustakohtainen, mutta sillä on taipumus seurata prosessia: make ja cd rakennushakemistoon, suorita cmake käännöstyökaluille ja arkkitehtuurille osoittaessasi vanhempaan hakemistoon. Koska käytin OSX Ninja -työkaluja 64-bittisellä alustalla, komento näytticmake -G "Ninja" -DPROJECT_ARCH="x86_64" ..
  5. Rakennushakemisto sisältää nyt tulostustiedostot. Rakenne voi olla hieman hämmentävä, mutta se on kuvattu pääosassa README. Viitteenä edellinen vaihe johti sovelluspakettiin build/tests/cefsimple/Release/cefsimple.app.
  6. Älä unohda, että sinun on tehtävä tämä luoda tarvittavat binääritiedostot jokaiselle tukemallesi alustalle ja käyttöjärjestelmän arkkitehtuurille.

Nyt kun sinulla on suoritettava tiedosto, suorita se komentoriviltä --urlasetettuna avattavalle verkkosivulle. Tämä tarkoittaa, että sen sisällyttäminen Python-komentosarjaan tapahtuu helposti subprocessmoduulin kautta .

Jos sitä ei vaadita, tutustu CEF-dokumentaatioon, jos olet kiinnostunut itse Chromiumin kokoamisesta. Se osoittaa sinut oikeaan suuntaan. Mutta varoitetaan, lataaminen, rakentaminen ja kokoaminen vie paljon aikaa. Vanha hyvätasoinen hevosvoiman käsittely auttaa varmasti saamaan nopeammat tulokset.

Pakkaus

Nyt kun voimme tarjota työpöydän kokemuksen, meidän on harkittava, kuinka jakaa se käyttäjillemme. Perinteinen Python-pakettien jakelu tapahtuu Python Package Index (PyPI) -palvelun kautta. Se kuitenkin vaatii käyttäjiltämme asentamaan Python-tulkin ja jonkinlaisen pakkaustyökalun, kuten easy_installtai pip.

Vaikka tämä ei ole erityisen vaikeaa, kannattaa ottaa huomioon laajempi käyttäjäjoukko. Asennusprosessin hallinta erillisillä manuaalivaiheilla on melko monimutkaista. Varsinkin ei-teknisen yleisön kanssa - jotkut heistä eivät tiedä, että Python on muuta kuin suuri käärme. Toiset taas ainakin tietävät eurooppalaisen kuormittamattoman niellä olevan ilman nopeuden.

Jos he osaavat kieltä, useimmilla on jo oma versio asennettuna. Täällä tulevat esiin pakettiriippuvuudet, erilaiset käyttöjärjestelmät, selaimet, joista et ole koskaan kuullut (tai joiden ajatellut jo olevan kuollut), samoin kuin käyttäjien erilaiset taidot virtuaalisten ympäristöjen luomisessa. Tämä tarkoittaa yleensä paljon aikaa, joka kuluu yhteensopimattomien ohjelmistojen tukemiseen.

Tällaisen suuren sotkun välttämiseksi on olemassa työkaluja, jotka voivat upottaa kaikki riippuvuutesi käyttöjärjestelmäkohtaisiin suoritettaviin tiedostoihin. Harkitun huolellisesti valitsemani pyrkimykseni on PyInstaller. Se näyttää tarjoavan eniten joustavuutta tuetuissa alustoissa ja muodoissa.

Lyhyt ote GitHub-arkistosta tiivistää asiat hienosti:

PyInstaller lukee kirjoittamasi Python-komentosarjan. Se analysoi koodisi löytääksesi kaikki muut moduulit ja kirjastot, joita komentosarja tarvitsee suoritettavaksi. Sitten se kerää kopiot kaikista näistä tiedostoista - mukaan lukien aktiivinen Python-tulkki! - ja sijoittaa ne komentosarjan kanssa yhteen kansioon tai valinnaisesti yhteen suoritettavaan tiedostoon.

Työkalu toteutti lupauksensa. Totesin sen Python tiedosto minun näytteen hakemuksen ja se nippujen se hakemistoon helposti tarpeeksi: pyinstaller sample.py. Kun haluan suoritettavan tiedoston, lisää vain --onefileparametri.

Se muuttuu hieman hankalammaksi, kun sinun on lisättävä muita kuin Python-tietoja pakettiin. Tämä pätee html- ja js-tiedostoihin, jotka muodostavat Sofin perustan, ja cefsimple- selaimessa, joka esittelee sovelluksen käyttöliittymän aikaisemmasta. PyInstaller-apuohjelma tarjoaa --add-datajuuri tämän mahdollistamalla kartoituksen polun polussa, jossa datatiedosto (tai hakemisto) asuu. Minulla kuitenkin kesti jonkin aikaa selvittää, kuinka päästä näihin hakemistoihin oikein koodissani. Onneksi dokumentaatio osoitti minut oikeaan suuntaan.

Kuten käy ilmi, kun suoritat PyInstaller-pakettisovelluksen, et voi luottaa __file__ja vastaaviin mekanismeihin polkujen määrittämisessä. Sen sijaan PyInstaller-käynnistyslatain tallentaa paketin absoluuttisen polun sisään sys._MEIPASSja lisää frozenattribuutin kertoakseen, että olet käynnissä paketin sisällä. Jos sys.frozenon, Truelataa sitten tiedostosi sen perusteella sys._MEIPASS, muuten määritä asiat normaalien polkufunktioiden avulla.

Pystyin luomaan onnistuneesti sekä OSX: n mukana toimitetun sovelluksen että suoritettavan Linux-binaarin samasta Python-komentosarjasta. Vahvistin, että voin tehdä saman Windows-suoritettavalla tiedostolla, mutta en ole vielä ehtinyt koota Windows-versiota cefsimple- selaimesta nipun polun testaamiseksi.

Lopputuote

Katso esimerkki selainkohtaisesta käyttöliittymästä, joka on pakattu tässä kuvattuun järjestelmään, tutustumalla esitykseeni PyCaribbean 2017: ssä.

CEF: n ja pakkausten kannalta oleellinen demo on kuvagalleria ja se ilmestyy noin klo 18.15.

Katso lisätietoja Sofin tekemisestä tutustumalla A Python Ate My GUI -sarjaan.

Jos pidit artikkelista ja haluat lukea lisää Pythonista ja ohjelmistokäytännöistä, käy osoitteessa tryexceptpass.org. Pysy ajan tasalla heidän uusimmasta sisällöstään tilaamalla postituslista.