» »

Python - command line arguments

Python - command line arguments

poweroff ::

V Pythonu bi rad napisal preprost programček, katerega namen je naslednji. Če programu dodaš cmd line parameter -k oz. -w, se vrednost ene spremenljivke spremeni, sicer pa ostane enaka.

Torej, naredim takole:

import getopt
import sys

kabelt ="connected"
wifi ="on"

argv = sys.argv[1:]
try:
    options, args = getopt.getopt(argv, "k:w:",
                               ["kabel =",
                                "wifi ="])
except:
    print("Error Message ")

for name, value in options:
    if name in ['-k', '--kabel']:
        kabel = "disconnected"
    elif name in ['-w', '--wifi']:
        wifi = "off"

print("Cable: " + kabel + ", WiFi: " + wifi)


Zdaj zadevo poženem takole:
python test1.py -k 1 -w 1
Cable: disconnected, WiFi: off

Torej, v tem primeru sta se spremenili spremenljivki cable in wifi.

Če dam samo cable:
python test1.py -k 1
Cable: disconnected, WiFi: on


Problem je pa, da moram dati -k nekaj, jaz bi rad dal samo -k:

python test1.py -k


No, tukaj pa dobim napako:
Error Message 
Traceback (most recent call last):
  File "test1.py", line 15, in <module>
    for name, value in options:
NameError: name 'options' is not defined


Kako bi bilo treba spremeniti Python program, da bi naredil to, kar želim?
sudo poweroff

amacar ::

Ugibam (ker ne pozna pythona), ampak jaz bi odstranil : in =

Torej:
getopt.getopt(argv, "kw", ["kabel","wifi ="])

Zgodovina sprememb…

  • spremenil: amacar ()

HotBurek ::

Ena izmed možnih rešitev:

#!/usr/bin/python3.7

# import
import sys;

kabel = "connected";
wifi  ="on";

argv = sys.argv[1:];

for item in argv:
    if item in ("-k", "--kabel"):
        kabel = "disconnected";
    elif item in ("-w", "--wifi"):
        wifi = "off";

print("Cable: " + kabel + ", WiFi: " + wifi);



p.s: Pa gor je napaka, kjer je definiran kabel, ekstra t.

kabelt ="connected"
root@debian:/# iptraf-ng
fatal: This program requires a screen size of at least 80 columns by 24 lines
Please resize your window

Zgodovina sprememb…

  • spremenilo: HotBurek ()

redo ::

Kot je že omenil amacar, so težave v : in =. getopt ima zelo kratka navodila. Sam pa zaradi lepših izpisov pomoči (ker se čez pol leta zagotovo ne spomnim, kaj je kaj), kot tudi preprostejše dodajanje nekaterih možnosti pri obdelavi argumentov, raje uporabim modul argparse:

#!/usr/bin/env python3

"""Simple parser"""

def parse_args():
    """Parse command line arguments."""
    import argparse
    parser = argparse.ArgumentParser(description='Simple parser.')
    parser.add_argument('-k', '--kabel', action='store_false', \
            help='Description for kabel')
    parser.add_argument('-w', '--wifi', action='store_true', \
            help='Description for wifi')
    return parser.parse_args()

def main(args):
    """Main function when run from command line."""
    kabel = 'connected' if args.kabel else 'disconnected'
    wifi = 'on' if args.wifi else 'off'
    print(f"Cable: {kabel}, WiFi: {wifi}")

if __name__ == '__main__':
    main(parse_args())


Tako lahko poženem tudi

$ ./test2.py -h

usage: test2.py [-h] [-k] [-w]

Simple parser.

optional arguments:
-h, --help show this help message and exit
-k, --kabel Description for kabel
-w, --wifi Description for wifi

kow ::

Da, argparse je standardna resitev.

poweroff ::

Hvala, je pomagalo in sem rešil.
sudo poweroff


Vredno ogleda ...

TemaSporočilaOglediZadnje sporočilo
TemaSporočilaOglediZadnje sporočilo
»

Izpis z awk med več vzorci (patterni)

Oddelek: Programiranje
5556 (425) poweroff
»

[Python3] Izvajanje ukazov po določenem času

Oddelek: Programiranje
211442 (1052) noraguta
»

Električno stikalo z oddaljenim nadzorom

Oddelek: Elektrotehnika in elektronika
131367 (886) Torx
»

Kako narediti python "cmd line" program

Oddelek: Programiranje
111590 (1013) ragezor
»

Python, prosim za pomoc pri programiranju (strani: 1 2 3 )

Oddelek: Programiranje
10413916 (10018) lenika

Več podobnih tem