Kirjoittaja Aihe: Omien ohjelmien ajaminen  (Luettu 4414 kertaa)

Snufkin

  • Käyttäjä
  • Viestejä: 454
    • Profiili
Omien ohjelmien ajaminen
« : 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:

Koodia: [Valitse]
(...kotihakemisto)$ python3 kello.py
mutta haluaisin kirjoittaa vain

Koodia: [Valitse]
$ 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.

Xubuntu 22.04 LTS, Fujitsu Lifebook E754

nm

  • Käyttäjä
  • Viestejä: 16427
    • Profiili
Vs: Omien ohjelmien ajaminen
« Vastaus #1 : 23.05.22 - klo:13.27 »
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:

Koodia: [Valitse]
#!/usr/bin/env python3
Aseta tiedosto vielä suoritettavaksi:

Koodia: [Valitse]
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.
« Viimeksi muokattu: 23.05.22 - klo:13.34 kirjoittanut nm »

Snufkin

  • Käyttäjä
  • Viestejä: 454
    • Profiili
Vs: Omien ohjelmien ajaminen
« Vastaus #2 : 23.05.22 - klo:15.17 »

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:

Koodia: [Valitse]
#!/usr/bin/env python3
Aseta tiedosto vielä suoritettavaksi:

Koodia: [Valitse]
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?

Xubuntu 22.04 LTS, Fujitsu Lifebook E754

kamara

  • Käyttäjä
  • Viestejä: 3028
    • Profiili
Vs: Omien ohjelmien ajaminen
« Vastaus #3 : 23.05.22 - klo:16.01 »
Jos käyttäisin monia python tiedostoja, niin Itse tekisin bash-scriptin pythonohjelmapuun käynnistämiseen.

Eli ...
nano ~/bin/ohjelma
Koodia: [Valitse]
#!/usr/bin/bash
cd pythonohjelmaan
python3 pythonohjelma.py
chmod 755 ~/bin/ohjelma

nm

  • Käyttäjä
  • Viestejä: 16427
    • Profiili
Vs: Omien ohjelmien ajaminen
« Vastaus #4 : 23.05.22 - klo:19.55 »
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.

Snufkin

  • Käyttäjä
  • Viestejä: 454
    • Profiili
Vs: Omien ohjelmien ajaminen
« Vastaus #5 : 24.05.22 - klo:11.03 »
Keksin toisenkin tavan tähän ongelmaan. Antaa olla ohjelmien omissa kansioissaan ja määrittelee aliaksella tuon komennon.

$
Koodia: [Valitse]
alias kello='python3 ~/...polku.../kello.py'
Xubuntu 22.04 LTS, Fujitsu Lifebook E754

nm

  • Käyttäjä
  • Viestejä: 16427
    • Profiili
Vs: Omien ohjelmien ajaminen
« Vastaus #6 : 24.05.22 - klo:12.18 »
Keksin toisenkin tavan tähän ongelmaan. Antaa olla ohjelmien omissa kansioissaan ja määrittelee aliaksella tuon komennon.

$
Koodia: [Valitse]
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

Snufkin

  • Käyttäjä
  • Viestejä: 454
    • Profiili
Vs: Omien ohjelmien ajaminen
« Vastaus #7 : 24.05.22 - klo:12.49 »
Keksin toisenkin tavan tähän ongelmaan. Antaa olla ohjelmien omissa kansioissaan ja määrittelee aliaksella tuon komennon.

$
Koodia: [Valitse]
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ää.

Xubuntu 22.04 LTS, Fujitsu Lifebook E754

Snufkin

  • Käyttäjä
  • Viestejä: 454
    • Profiili
Vs: Omien ohjelmien ajaminen
« Vastaus #8 : 24.05.22 - klo:12.55 »
Jos käyttäisin monia python tiedostoja, niin Itse tekisin bash-scriptin pythonohjelmapuun käynnistämiseen.

Koodia: [Valitse]
#!/usr/bin/bash
cd pythonohjelmaan
python3 pythonohjelma.py

Eikö tuo alias tee saman asian helpommin?
Xubuntu 22.04 LTS, Fujitsu Lifebook E754

kamara

  • Käyttäjä
  • Viestejä: 3028
    • Profiili
Vs: Omien ohjelmien ajaminen
« Vastaus #9 : 24.05.22 - klo:15.08 »
Jos käyttäisin monia python tiedostoja, niin Itse tekisin bash-scriptin pythonohjelmapuun käynnistämiseen.

Koodia: [Valitse]
#!/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.

nm

  • Käyttäjä
  • Viestejä: 16427
    • Profiili
Vs: Omien ohjelmien ajaminen
« Vastaus #10 : 24.05.22 - klo:16.07 »
Keksin toisenkin tavan tähän ongelmaan. Antaa olla ohjelmien omissa kansioissaan ja määrittelee aliaksella tuon komennon.

$
Koodia: [Valitse]
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.  :)

_Pete_

  • Käyttäjä
  • Viestejä: 1845
  • Fufufuuffuuu
    • Profiili
Vs: Omien ohjelmien ajaminen
« Vastaus #11 : 25.05.22 - klo:08.38 »

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