Nieuws:

Welkom, Gast. Alsjeblieft inloggen of registreren.
Heb je de activerings-mail niet ontvangen?

Auteur Topic: call functie en funtie vragen  (gelezen 2764 keer)

Offline daniel

  • Lid
call functie en funtie vragen
« Gepost op: 2015/01/19, 09:31:54 »
Hallo, ik wilde vragen of het mogelijk is om linux commands te verwerken in Python.
Ik wilde graag de commandos
sudo apt-get install software enzenzenz kunnen invoeren in python en dergelijke.
« Laatst bewerkt op: 2015/02/09, 15:20:26 door daniel »

Re: Hoe kan ik linux commands in python verwerken?
« Reactie #1 Gepost op: 2015/01/19, 09:43:03 »
Ik gebruik hiervoor de call functie uit de subprocess module.

https://docs.python.org/2/library/subprocess.html

Offline daniel

  • Lid
Re: Hoe kan ik linux commands in python verwerken?
« Reactie #2 Gepost op: 2015/01/19, 12:02:24 »
Dankjewel FreeTheBee, maar ik ben na heel wat jaren weer begonnen met python en ik wil graag weten hoe
ik de linux commands kan gebruiken in een python script wat me niet helemaal duidelijk is..
Ik heb wel ervaring met c++

vb:

sudo apt-get update && sudo apt-get upgrade
sudo apt-get install k3b -y
enz enz

Deze wil ik als voorbeeld in een pythonscript laten werken.
Kun je mij hiervoor een voorbeeld sturen?

Offline profoX

  • Lid
    • wesley
    • Lionslink
Re: Hoe kan ik linux commands in python verwerken?
« Reactie #3 Gepost op: 2015/01/19, 15:00:10 »
FreeTheBee heeft het bij het rechte eind volgens mij. Lees de documentatie op: https://docs.python.org/2/library/subprocess.html
Voor Python 3 bestaat dit ook. https://docs.python.org/3.4/library/subprocess.html
Human Knowledge Belongs To The World -- Antitrust (2001)
Nederlandstalige Ubuntu documentatie van Ubuntu-NL (wiki)

Re: Hoe kan ik linux commands in python verwerken?
« Reactie #4 Gepost op: 2015/01/19, 16:31:20 »
Ik gebruik onderstaande functie om tekst bestanden met foute encoding te reparen.
import subprocess

def recode(file_name):
    '''filename -> bash recode to utf'''
    subprocess.call('recode ISO-8859-15..UTF8 {0}'.format(file_name), shell=True)

Dit is het commando dat dan uitgevoerd wordt.
recode UTF8..ISO-8859-15 file_name

De shell =True optie wordt dacht ik wel een bekritiseerd, maar het werkt  ;)

Offline daniel

  • Lid
Re: Hoe kan ik linux commands in python verwerken?
« Reactie #5 Gepost op: 2015/01/19, 16:53:30 »
bij deze code:

import subprocess
subprocess.call(['/home/daniel/test/helloworld.py'])

------------------------------------------------------------------------------------------
Ik wilde een andere python script laten draaien met als vb en opdracht helloworld.py
als ik deze wil openen in v.3,4 dan krijg ik de volgende melding:


Traceback (most recent call last):
  File "/home/daniel/test/test.py", line 2, in <module>
    subprocess.call(['/home/daniel/test/helloworld.py'])
  File "/usr/lib/python3.4/subprocess.py", line 533, in call
    with Popen(*popenargs, **kwargs) as p:
  File "/usr/lib/python3.4/subprocess.py", line 848, in __init__
    restore_signals, start_new_session)
  File "/usr/lib/python3.4/subprocess.py", line 1446, in _execute_child
    raise child_exception_type(errno_num, err_msg)
OSError: [Errno 8] Exec format error
« Laatst bewerkt op: 2015/02/10, 21:23:06 door TopGear »

Re: Hoe kan ik linux commands in python verwerken?
« Reactie #6 Gepost op: 2015/01/19, 18:58:48 »
Andere Python bestanden worden het beste gewoon geimporteerd in plaats van uitgevoerd.

import helloworld
Dit vereist wel dat helloworld.py ergens in sys.path zit.

Offline daniel

  • Lid
Re: Hoe kan ik linux commands in python verwerken?
« Reactie #7 Gepost op: 2015/01/19, 19:24:35 »
Og stom van me....

Bedankt allemaal ik had hem vergeten onder sys.path te zetten...


Offline profoX

  • Lid
    • wesley
    • Lionslink
Re: Hoe kan ik linux commands in python verwerken?
« Reactie #8 Gepost op: 2015/01/19, 22:59:46 »
OSError: [Errno 8] Exec format error

het script kan niet uitgevoerd worden omdat de shebang ontbreekt,
voeg deze toe bovenaan het script (bv. #!/usr/bin/env python3)
andere optie is natuurlijk om gewoon rechtstreeks python aan te roepen in dit geval:

import subprocess
subprocess.call(['python3', '/home/daniel/test/helloworld.py'])
Human Knowledge Belongs To The World -- Antitrust (2001)
Nederlandstalige Ubuntu documentatie van Ubuntu-NL (wiki)

Offline daniel

  • Lid
Re: Hoe kan ik linux commands in python verwerken?
« Reactie #9 Gepost op: 2015/01/22, 14:59:48 »
profox bedankt voor je tip deze module had ik exact nodig want die was ik vergeten.
Ik had python3 er ook niet voorgezet,
code tussendoor:
#lol code:
x=("stom")
print x*3
-----------------------------------------------------------------------------------------------------------------------------------------------------
Ik heb hem ietsje aangepast omdat ik deze functie nog vaker zou moeten gebruiken.

# Module import subprocess en call hieraan toevoegen

from subprocess import call
call(("python3", "/home/daniel/test/helloworld.py")) # zie hieronder nog andere voorbeelden
call (("ls", "-l"))
call (("sudo", "apt-get", "update"))
call ("gnome-system-monitor")



Bedankt allemaal....

----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------


Ik heb nog wel wat vragen over de beslissing opdrachten die niet helemaal werken:
wie kan deze code zo schrijven dat hij werkt:

from subprocess import call
x1= input ("kies:\n1 voor update\n2 voor print opdracht")
if x1 ==1:
    call(("sudo", "apt-get", "update"))
elif x2 ==2:
            print("hello world!")


uitkomst moet zijn:

Kies:

1 voor update
2 voor print opdracht
« Laatst bewerkt op: 2015/02/10, 21:23:57 door TopGear »

Re: Hoe kan ik linux commands in python verwerken?
« Reactie #10 Gepost op: 2015/01/23, 12:15:21 »
input() geeft een string terug in Python 3. Uw if/elif condities vergelijken met een integer. Ook de variabele x2 bestaat niet, dit moet in beide gevallen x1 zijn.

Het moet dus zo:

from subprocess import call
x1 = input("kies:\n1 voor update\n2 voor print opdracht")
if x1 == "1":
    call(("sudo", "apt-get", "update"))
elif x1 == "2":
    print("hello world!")

Offline daniel

  • Lid
Re: Hoe kan ik linux commands in python verwerken?
« Reactie #11 Gepost op: 2015/01/23, 12:21:24 »
Nunslaughter  =D

Je maakt me erg blij want het werkt en nu kan ik het programma uitbreiden...
Bedankt....

Het programma waar ik aan werk is te zien op youtube:

https://www.youtube.com/watch?v=Ztx6zTpK11I&feature=youtu.be

iedereen bedankt...
« Laatst bewerkt op: 2015/02/10, 21:24:35 door TopGear »

Re: Hoe kan ik linux commands in python verwerken?
« Reactie #12 Gepost op: 2015/01/23, 16:14:07 »
Ik heb vlug iets in elkaar gestoken na het bekijken van de video. Er zijn namelijk wat problemen:
 - Het script moet na iedere taak opnieuw gestart worden
 - Geen foutcontrole (wat als de gebruiker een ongeldig nummer of iets anders typt?)
 - Bij het uitbreiding van opties zal het een lange en lelijke if/else lijst worden

Dus hier mijn poging tot het oplossen van deze puntjes:
#!/usr/bin/env python3

from subprocess import call

def do_update():
    print("Updating...")
    call(("sudo", "apt-get", "update"))

def do_print_hello():
    print("Hello, world!")

def print_menu():
    print("")
    print("-" * 40)
    print("Welke taak wil u uitvoeren?")
    for index, choice in enumerate(choices):
        print("  %s: %s" % (index, choice["help"]))
    print("  q: Quit")

choices = [
    {"help": "Update", "func": do_update},
    {"help": "Print hello", "func": do_print_hello},
]

while True:
    print_menu()
    choice = input("> ")
    if choice.lower() == "q":
        break
    try:
        choices[int(choice)]["func"]()
    except (ValueError, IndexError, KeyError):
        print("\nOngeldige taak! Probeer opnieuw.")
    except KeyboardInterrupt:
        print("\nTaak onderbroken door de gebruiker.")
    else:
        print("\nTaak compleet! Maak een nieuwe keuze.")

Toevoegen van opties gaat door een nieuwe dict aan de choices list toe te voegen en een functie voor deze optie die het werk doet. De rest word automatisch gedaanaAA.

Als het de bedoeling is om zelf te leren programmeren, probeer dan de bovenstaande code zoveel mogelijk te begrijpen of vergeet wat ik gemaakt heb en probeer zelf uw huidige code te verbeteren.

Offline daniel

  • Lid
Re: Hoe kan ik linux commands in python verwerken?
« Reactie #13 Gepost op: 2015/01/23, 18:20:52 »
Bedankt voor de tip en de moeite hiervoor.
 Ik had me nog niet zo verdiept in de functie def maar het is duidelijk uitgelegd en helder,
na wat ermee gerommeld te hebben had ik het door, erg handig.
Ook kende ik de Built-in Functions >enumerate   nog niet helemaal.

Ik bedank je hiervoor..

Nog een nieuwe vraag:

Is het ook mogelijk om een manual pagina te maken van python programma?
zoals je in linux bv:    voor het programma (nano)  op kan roepen door:      man nano
iemand een idee? ????

« Laatst bewerkt op: 2015/02/10, 21:24:58 door TopGear »

Re: Python 3.4 vragen /antwoorden /ideenbus voor beginners
« Reactie #14 Gepost op: 2015/01/26, 19:43:43 »
Hier heel wat informatie over man: http://www.cyberciti.biz/faq/linux-unix-creating-a-manpage/

Het kan ook met een GUI zoals gmanedit: https://apps.ubuntu.com/cat/applications/gmanedit/

Edit: gaat het misschien om een helppagina van de commandline arguments weer te geven? Zoals "my_app --help"? Gebruik dan de argparse module, deze maakt dat automatisch aan voor uw script: https://docs.python.org/3.4/library/argparse.html#module-argparse
« Laatst bewerkt op: 2015/01/26, 19:46:00 door Nunslaughter »

Offline daniel

  • Lid
Re: Python 3.4 vragen /antwoorden /ideenbus voor beginners
« Reactie #15 Gepost op: 2015/01/27, 23:41:13 »
dankjewel

Ik begin de def function een beetje te leren alleen snap ik niet hoe ik op een simpele manier deze code werkende kan krijgen.

__author__ = 'daniel'

import subprocess
import sys

def name(do):
    do=str(input("wat is jou naam? "))
    print ("welkom", do)
    """ hulp vraag
    waarom slaat hij deze eerste def over en gaat direct door naar de 2e?"""



def load(arg1):
    subprocess.call (("sudo", "apt-get", "install", "-y", arg1))
    print("de computer installeerd software")
load("k3b")
load("qbittorrent")

""" dit is een voorbeeld van installeren van software"""

import os
import subprocess

def name(do):
    do=str(input("wat is jou naam? "))
    print ("welkom", do)

def load(arg1):
    subprocess.call (("sudo", "apt-get", "install", "-y", arg1))
    print("de computer installeerd software")
load("k3b")
load("qbittorrent")
« Laatst bewerkt op: 2015/02/10, 21:24:13 door TopGear »

Re: Python 3.4 vragen /antwoorden /ideenbus voor beginners
« Reactie #16 Gepost op: 2015/02/07, 12:20:24 »
Ik begin de def function een beetje te leren alleen snap ik niet hoe ik op een simpele manier deze code werkende kan krijgen.

Zeg altijd wat er niet werkt. Wat verwacht ge dat de code doet? Welke foutmeldingen komen er of wat gebeurt er?

Offline daniel

  • Lid
Re: Python 3.4 vragen /antwoorden /ideenbus voor beginners
« Reactie #17 Gepost op: 2015/02/07, 12:21:46 »
Hij gaat in deze voorbeeld code gelijk naar de installatie en vraagt niet wat je naam is..


Ik wil graag meer funtions def in een bestand hebben en dankzei jou uitleg over de def function
zie ik in dat dit makkelijker werkt...
bedankt nunslaughter...

Maar hoe krijg ik deze voorbeeld code zo makkelijk mogelijk dat hij mijn eerst vraagt om me naam en een output geeft van welkom (naam) en vervolgens naar de 2e def (load(arg1) gaat en daar de installatie uitvoerd?
« Laatst bewerkt op: 2015/02/07, 12:26:14 door daniel »

Re: Python 3.4 vragen /antwoorden /ideenbus voor beginners
« Reactie #18 Gepost op: 2015/02/07, 12:28:28 »
Ok, ge definieerd de functie name maar roept deze nooit aan.

Neem volgend simpel voorbeeld:
def print_hello_world():
    print("Hello, world!")

Deze doet opzich niets. Daarvoor moeten we de functie expliciet aanroepen:
def print_hello_world():
    print("Hello, world!")
print_hello_world()

Offline daniel

  • Lid
Re: Python 3.4 vragen /antwoorden /ideenbus voor beginners
« Reactie #19 Gepost op: 2015/02/07, 12:29:52 »
hoe doe ik dat de functie expliciet aanroepen in mijn voorbeeld code?

Zo werkt die ook niet:

import os
import subprocess

def name(do):
    do=str(input("wat is jou naam? "))
    print ("welkom", do)
    name()  # nieuw toegevoegd om aan te roepen

def load(arg1):
    subprocess.call (("sudo", "apt-get", "install", "-y", arg1))
    print("de computer installeerd software")
load("k3b")
load("qbittorrent")
« Laatst bewerkt op: 2015/02/10, 21:14:03 door TopGear »

Re: Python 3.4 vragen /antwoorden /ideenbus voor beginners
« Reactie #20 Gepost op: 2015/02/07, 12:40:01 »
Inspringen is ontzettend belangrijk in Python, dit definieerd de blokken code. Uw stukje code word dan dit:

import subprocess

def name():
    do=str(input("wat is jou naam? "))
    print ("welkom", do)

def load(arg1):
    subprocess.call (("sudo", "apt-get", "install", "-y", arg1))
    print("de computer installeerd software")

name()  # Roept de name() functie aan
load("k3b")
load("qbittorrent")

Belangrijke wijziging hier: verwijder het do argument. Het doet helemaal niks en bij het laten staan zou name() ook niet werken aangezien ge geen argument meegeeft.

Dit is trouwens heel basic en ik zou een tutorial lezen over functies om er een beetje meer informatie over op te doen.

Offline daniel

  • Lid
Re: Python 3.4 vragen /antwoorden /ideenbus voor beginners
« Reactie #21 Gepost op: 2015/02/07, 12:46:57 »
Ik ben ook maar net bezig in de programmeer taal python.
zou je mij anders een tutorial  kunnen adviseren?

Mijn vraag is dus om deze onderste code aan de praat te krijgen:
Hij doet niets..

en ik wil graag het simpele begrijpen om het vervolgens anders te kunnen doen..

import os
import subprocess



x1= input ("kies:\n1 installatie\n2 voor update")
if x1 ==1:

    def load(arg):
        subprocess.call (("sudo", "apt-get", "install", "-y", arg))
        load("k3b")
        load("qbittorrent")
        return;

elif x1 ==2:
    subprocess.call(("sudo", "apt-get", "update"))
else:
    pass

De bovenste code doet niets, waarom niet????????
« Laatst bewerkt op: 2015/02/10, 21:25:26 door TopGear »

Re: Python 3.4 vragen /antwoorden /ideenbus voor beginners
« Reactie #22 Gepost op: 2015/02/07, 14:02:48 »
Er gebeuren daar vreemde dingen. De functiedefinitie kun je beter naar boven halen (buiten het if-blok). Verder roep je de functie load aan binnen de functie zelf. Dit heet recursie en is een zeer waardevolle programmeertechniek, maar niet wat je hier wil waarschijnlijk ;) Tip: Zet je code eens tussen codetags (de knop met het hekje), dat maakt het voor ons een stuk overzichtelijker.

En, zoals gezegd door Nunslaughter, pas als je buiten de functiedefinitie een aanroep doet naar de functie wordt de code binnen de functie uitgevoerd.

Even een voorbeeld je van subprocess, dit werkt bij mij (met python3)
import subprocess

def ls(path): 
    args = ["ls","-al"]
    args.append(path)
    subprocess.call(args)

ls("/home/erik")
« Laatst bewerkt op: 2015/02/07, 14:15:19 door erik1984 »

Offline daniel

  • Lid
Re: Python 3.4 vragen /antwoorden /ideenbus voor beginners
« Reactie #23 Gepost op: 2015/02/07, 14:37:29 »
bedankt Erik ik zal het uitproberen

Re: Python 3.4 vragen /antwoorden /ideenbus voor beginners
« Reactie #24 Gepost op: 2015/02/07, 14:51:19 »
Graag gedaan. Heb toch ook nog even naar jouw specifieke code gekeken en die doet waarschijnlijk niks omdat het resultaat van input() een tekst is en geen nummer. Heb jouw code iets aangepast en zo werkt het bij mij wel :

import subprocess

def load(arg):
    subprocess.call (("sudo", "apt-get", "install", "-y", arg))

x1 = input("kies:\n1 installatie\n2 voor update")
if x1 == "1":
    load("k3b")
    load("qbittorrent")
elif x1 == "2":
    subprocess.call(("sudo", "apt-get", "update"))
else:
    pass