Ubuntu Suomen keskustelualueet
Ubuntun käyttö => Ohjelmointi, palvelimet ja muu edistyneempi käyttö => Aiheen aloitti: Snufkin - 23.05.22 - klo:13.22
-
Moi!
Miten saan luotua komentorivikomennon, jolla käynnistyy tekemäni python-ohjelma? Itse ohjelma toimii oikein, kun kirjoitan siinä hakemistossa, jossa koodi on:
(...kotihakemisto)$ python3 kello.py
mutta haluaisin kirjoittaa vain
$ kello
jolloin järjestelmä ymmärtää sen komennoksi ja käynnistää ohjelman 'kello.py'. Pitääkö tuohon luoda joku skripti, vai miten homma toimii?
Minulla on kotihakemistossa 'bin' kansio, joka lisätty käynnistyspolkuun, eli esim. käännetyt c-ohjelmat lähtevät käyntiin ihan pelkällä tiedoston nimellä kaikkialta hakemistopuusta. Nyt pitäisi saada sama systeemi Python-ohjelmille.
-
Minulla on kotihakemistossa 'bin' kansio, joka lisätty käynnistyspolkuun, eli esim. käännetyt c-ohjelmat lähtevät käyntiin ihan pelkällä tiedoston nimellä kaikkialta hakemistopuusta. Nyt pitäisi saada sama systeemi Python-ohjelmille.
Jos se on yksittäinen Python-skripti, joka ei vaadi seurakseen muita ohjelmatiedostoja (moduuleja), voit kopioida tiedoston sinne ~/bin -hakemistoon nimellä kello, eli .py-päätteen voi jättää pois. Jos tiedostossa ei vielä ole shebang-riviä, lisää se tiedoston ensimmäiselle riville:
#!/usr/bin/env python3
Aseta tiedosto vielä suoritettavaksi:
chmod a+x ~/bin/kello
Laajemman moduuleista koostuvan python-sovelluksen asentamiseen kannattaa käyttää setuptoolsia: https://packaging.python.org/en/latest/tutorials/packaging-projects/
Sillä voi rakentaa projektista wheel-tiedoston, joka on asennettavissa pipillä suoraan tiedostosta tai julkisen PyPi-repositorion kautta.
-
Jos se on yksittäinen Python-skripti, joka ei vaadi seurakseen muita ohjelmatiedostoja (moduuleja), voit kopioida tiedoston sinne ~/bin -hakemistoon nimellä kello, eli .py-päätteen voi jättää pois. Jos tiedostossa ei vielä ole shebang-riviä, lisää se tiedoston ensimmäiselle riville:
#!/usr/bin/env python3
Aseta tiedosto vielä suoritettavaksi:
chmod a+x ~/bin/kello
Laajemman moduuleista koostuvan python-sovelluksen asentamiseen kannattaa käyttää setuptoolsia: https://packaging.python.org/en/latest/tutorials/packaging-projects/
Sillä voi rakentaa projektista wheel-tiedoston, joka on asennettavissa pipillä suoraan tiedostosta tai julkisen PyPi-repositorion kautta.
Kiitos neuvoista, näillä onnistui. Toistaiseksi nämä ohjelmani mahtuvat yhteen tiedostoon.
Jos haluan käyttää jotain tallennustiedostoja ohjelmissani ja tuo skripti on tuolla bin-kansiossa, niin teenko koodiin vain sopivat hakemistopolut tiedostojen eteen vai miten se homma hoituu?
Vai onko fiksumpi laittaa kaikki (skripti + tallennukset) omaan kansioonsa lisätä se kansio tuonne PATH-muuttujaan?
-
Jos käyttäisin monia python tiedostoja, niin Itse tekisin bash-scriptin pythonohjelmapuun käynnistämiseen.
Eli ...
nano ~/bin/ohjelma
#!/usr/bin/bash
cd pythonohjelmaan
python3 pythonohjelma.py
chmod 755 ~/bin/ohjelma
-
Jos haluan käyttää jotain tallennustiedostoja ohjelmissani ja tuo skripti on tuolla bin-kansiossa, niin teenko koodiin vain sopivat hakemistopolut tiedostojen eteen vai miten se homma hoituu?
Mielestäni kannattaa määritellä skriptin alussa muuttuja datakansiolle, ja käyttää sitten sitä muualla skriptissä tiedostoihin viitatessa.
Datakansio voi olla tarpeesta riippuen käyttäjän kotihakemiston alla sijaitseva .local/share/omaohjelma, tai vaikka ~/omadata. Skriptissä voi myös tarkistaa, että kyseinen kansio on olemassa ja tarvittaessa luoda se automaattisesti.
-
Keksin toisenkin tavan tähän ongelmaan. Antaa olla ohjelmien omissa kansioissaan ja määrittelee aliaksella tuon komennon.
$ alias kello='python3 ~/...polku.../kello.py'
-
Keksin toisenkin tavan tähän ongelmaan. Antaa olla ohjelmien omissa kansioissaan ja määrittelee aliaksella tuon komennon.
$ alias kello='python3 ~/...polku.../kello.py'
Joo, toimiihan tuokin. Huomaa kuitenkin, että työhakemisto on se, jossa komentotulkki sattuu olemaan silloin, kun käyttäjä ajaa tuon kello-komennon. Kiinteät datahakemistot täytyy siis joka tapauksessa määritellä absoluuttisilla poluilla tai vaihtoehtoisesti suhteessa skriptin sijaintiin, jonka saa ajon aikana muuttujasta __file__: https://stackoverflow.com/a/9350788
-
Keksin toisenkin tavan tähän ongelmaan. Antaa olla ohjelmien omissa kansioissaan ja määrittelee aliaksella tuon komennon.
$ alias kello='python3 ~/...polku.../kello.py'
Joo, toimiihan tuokin. Huomaa kuitenkin, että työhakemisto on se, jossa komentotulkki sattuu olemaan silloin, kun käyttäjä ajaa tuon kello-komennon. Kiinteät datahakemistot täytyy siis joka tapauksessa määritellä absoluuttisilla poluilla tai vaihtoehtoisesti suhteessa skriptin sijaintiin, jonka saa ajon aikana muuttujasta __file__: https://stackoverflow.com/a/9350788
Eikö ne datatiedostot voi olla samassa kansiossa kuin se skripti? Silloin ei tarvitse mitään polkuja koodiin, pelkkä tiedostonimi riittää.
-
Jos käyttäisin monia python tiedostoja, niin Itse tekisin bash-scriptin pythonohjelmapuun käynnistämiseen.
#!/usr/bin/bash
cd pythonohjelmaan
python3 pythonohjelma.py
Eikö tuo alias tee saman asian helpommin?
-
Jos käyttäisin monia python tiedostoja, niin Itse tekisin bash-scriptin pythonohjelmapuun käynnistämiseen.
#!/usr/bin/bash
cd pythonohjelmaan
python3 pythonohjelma.py
Eikö tuo alias tee saman asian helpommin?
Se ei ole aivan sama asia...
... scriptiin voi mm. tehdä symbolisen linkin ja/tai käynnistyskuvakkeen työpöydälle.
-
Keksin toisenkin tavan tähän ongelmaan. Antaa olla ohjelmien omissa kansioissaan ja määrittelee aliaksella tuon komennon.
$ alias kello='python3 ~/...polku.../kello.py'
Joo, toimiihan tuokin. Huomaa kuitenkin, että työhakemisto on se, jossa komentotulkki sattuu olemaan silloin, kun käyttäjä ajaa tuon kello-komennon. Kiinteät datahakemistot täytyy siis joka tapauksessa määritellä absoluuttisilla poluilla tai vaihtoehtoisesti suhteessa skriptin sijaintiin, jonka saa ajon aikana muuttujasta __file__: https://stackoverflow.com/a/9350788
Eikö ne datatiedostot voi olla samassa kansiossa kuin se skripti? Silloin ei tarvitse mitään polkuja koodiin, pelkkä tiedostonimi riittää.
Data voi olla samassa kansiossa kuin skripti, mutta koodissa ei riitä pelkkä tiedostonimi, jos skriptiä ajetaan jossain muualla kuin skriptin kansiossa. Kokeile niin näet mitä tapahtuu. :)
-
Eikö ne datatiedostot voi olla samassa kansiossa kuin se skripti? Silloin ei tarvitse mitään polkuja koodiin, pelkkä tiedostonimi riittää.
Jokaisella prosessilla on olemassa current work dir, joka voi olla eri riippuen mistä/miten prosessi käynnistää. Sen takia suhteelliset
tiedostoviittaukset voivat osoittaa eri paikkaan.
https://www.baeldung.com/linux/find-working-directory-of-running-process