Du må være registrert og logget inn for å kunne legge ut innlegg på freak.no
X
LOGG INN
... eller du kan registrere deg nå
Dette nettstedet er avhengig av annonseinntekter for å holde driften og videre utvikling igang. Vi liker ikke reklame heller, men alternativene er ikke mange. Vær snill å vurder å slå av annonseblokkering, eller å abonnere på en reklamefri utgave av nettstedet.
  4 5714
Hei alle sammen!

Jeg fikk det plutselig for meg å prøve å lage et lite program, Fruktlogg, som hjelper meg å holde oversikt over hvor mye frukt jeg spiser. Selvsagt mer for læringens skyld, enn for den praktiske nyttens skyld. Da jeg er litt uvant med kommandokjøring i bash etc så vender jeg meg til dere for innspill. Jeg lurer rett og slett på om jeg bruker argumentene på riktig måte.

Kort fortalt:
Jeg vil ha mulighet til å legge inn hvor mye av hver frukt jeg spiser pr dag, og kunne se en graf som viser utviklingen fra dag til dag. I første omgang tenkte jeg å ha kommandolinjeinterface, og jeg ser for meg noe lignende av flagg:

Kode

-a, --appelsin  Antall appelsiner spist
-b, --banan     Antall bananer spist
-d, --drue      Antall druer spist
-e, --eple      Antall epler spist
-h, --help      Hjelpemeny
-v, --version   Programmets versjonsnr
--dato          Dato, hvis ikke i dag (dd-mm-yyyy)
Hvis programmet kalles uten argumenter, tenkte jeg å bare vise grafene for alle fruktene som er lagt inn fra tidligere dager, hver frukt som et vanlig linjeplott.

Viser bare grafer:

Kode

$ fruktlogg
Spiser to bananer i dag:

Kode

$ fruktlogg -b 2
Spiser én appelsin og fire epler i dag:

Kode

$ fruktlogg -a 1 -e 4
Spiste to bananer og 74 druer den 8. mai:

Kode

$ fruktlogg -b 2 -d 74 --dato 08-05-2019
Jeg vet ennå ikke hvordan jeg skal gjøre dette i praksis – det blir hele utfordringen/moroa – men jeg tenkte å høre med dere om dette er en grei løsning, før jeg prøver å finne ut hvordan jeg skal få det til.

Så, hva tenker dere? Virker dette som en noenlunde normal måte å kjøre programmer på? Normal bruk av flagg og argumenter? Eller er det noe som er helt på jordet? Noe annet jeg bør tenke på?

Tusen takk for alle innspill


Edit:
Og hvordan vil i så fall den der instruks-linjen se ut? Den som er sånn:

Kode

$ fruktlogg [-a|-b|-d] ANTALL [--date]
....noe sånt. Dette dro jeg bare ut fra ræva, men. Hvordan blir det?
Sist endret av MatFot; 21. juni 2019 kl. 06:54.
Trådstarter
Takk for svar!
Har skjønt at det er argparse som gjelder, så kommer nok definitivt til å se på dette etterhvert.

I denne tråden håpte jeg først og fremst å finne ut om bruken jeg har sett for meg er en normal måte å kalle programmet på. Altså med masse valgfrie flagg, der hvert enkelt flagg etterfølges av én verdi, og med en valgfri --date med etterfølgende verdi helt på slutten av alt. Er det slik det bør være, eller bør programmet kalles på andre måter, eller bør jeg bruke flaggene på andre måter, eller ...? Bare så jeg ikke går i gang og bruker mye tid og krefter på å lage noe, så strider det plutselig mot alle normer og regler for CLIs.

Som sagt, veldig uvant med Linux og bash og sånt, så er litt usikker på hva som er konvensjon og ikke her.
Sist endret av MatFot; 21. juni 2019 kl. 07:19.
Du kan bruke argparse modulen.
https://docs.python.org/3.7/howto/argparse.html

Her er et utdrag fra et program jeg holder på å skrive som viser hvordan man bruker det:

#!/usr/bin/env python
##################
# #
# IMPORT MODULES #
# #
##################
import subprocess, os, platform, argparse,importlib

##############################
# #
# PARSE COMMAND LINE OPTIONS #
# #
##############################
# parse command line arguments
parser = argparse.ArgumentParser()

# searchphrase
parser.add_argument("search",help="the term to search for",nargs="?")

# list sorts
parser.add_argument("--list_sorts",help="list all sort options",action="store_true")

# sort
parser.add_argument("-s","--sort",help="specify a sort option")

# list categories
parser.add_argument("--list_categories",help="list all categories",action="store_true")

# category
parser.add_argument("-c","--category",help="specify a category (categories might be different for each backend)")

# list backends
parser.add_argument("--list_backends",help="list all backends",action="store_true")

# backend
parser.add_argument("-b","--backend",help="specify a tracker or indexer (uses bitlordsearch by default)",default="bitlordsearch")

# command
parser.add_argument("--command",help="open magnets with a custom command (%%s will be replaced with the url)")

# results
parser.add_argument("-r","--results",help="the maximum number of results to display",type=int,default=24)

# stdout
parser.add_argument("--stdout",help="print everything to stdout and exit (useful for script integration)",action="store_true")

# rank mirrors
parser.add_argument("--rank_mirrors",help="rank all mirrors by response time. (not implemented yet)",action="store_true")

args = parser.parse_args()
Vis hele sitatet...
Verdiene blir her lagret i args.<argument>. For eksempel args. For eksempel args.search for

søkeutrykket. (fint om en admin kan slå sammen innleggene mine, redigeringstiden min gikk ut).

Sitat av MatFot Vis innlegg
Takk for svar!
Har skjønt at det er argparse som gjelder, så kommer nok definitivt til å se på dette etterhvert.

I denne tråden håpte jeg først og fremst å finne ut om bruken jeg har sett for meg er en normal måte å kalle programmet på. Altså med masse valgfrie flagg, der hvert enkelt flagg etterfølges av én verdi, og med en valgfri --date med etterfølgende verdi helt på slutten av alt. Er det slik det bør være, eller bør programmet kalles på andre måter, eller bør jeg bruke flaggene på andre måter, eller ...? Bare så jeg ikke går i gang og bruker mye tid og krefter på å lage noe, så strider det plutselig mot alle normer og regler for CLIs.

Som sagt, veldig uvant med Linux og bash og sånt, så er litt usikker på hva som er konvensjon og ikke her.
Vis hele sitatet...
Bruken du har sett for deg er en helt normal måte å bruke argparse på. Flaggene er valgfrie og tar en verdi med mindre du spesifiserer noe annet. Du kan også velge at et flagg er boolsk altså at hvis man tilkaller programmet med det boolske flagget blir en verdi satt til True uten noe argument.

Foresten er ikke kommandolinjeprogrammer eksklusive til hverken bash eller linux så det er mer korrekt å referer til denne typen program som cli(command line interface) program.

Bash er bare et skall. I de aller fleste skall tilkaller man programmer på samme måte, altså med argumentene separert med mellomrom, men man kan også tilkalle cli programmer fra andre programmer eller script skrevet i andre programmeringsspråk.

(gnu/)Linux er bare et operativsystem. Det finnes mange andre operativsystem som kan kjøre python og interpretere python skript.
Sist endret av ThinkpadX200; 21. juni 2019 kl. 07:49. Grunn: Automatisk sammenslåing med etterfølgende innlegg.
▼ ... noen måneder senere ... ▼

Kode

import io
import time
import cv2
import numpy as np
import datetime as dt
import datetime
import sys
import random
import argparse
#from sense_hat import SenseHat
#import picamera

#from picamera.array import PiRGBArray


##### Logging Settings #####
#FILENAME = ""
#WRITE_FREQUENCY = 100


ap = argparse.ArgumentParser()

ap.add_argument("--takepix", type=int,default=-1,
	help="")
ap.add_argument("--serieslength", type=int,default=10,
	help="")
ap.add_argument("--captcont", type=int,default=-1,
	help="")
ap.add_argument("--randomize", type=int,default=1,
	help="") 
ap.add_argument("--processpix", type=bool,default=False,
	help="")
ap.add_argument("--recvideo", type=bool,default=False,
	help="")
ap.add_argument("--squaresprocess", type=bool,default=False,
	help="")
ap.add_argument("--harrysprocess", type=bool,default=False,
	help="")
ap.add_argument("--subpixelharry", type=bool,default=False,
	help="")
ap.add_argument("--houghprocess", type=bool,default=False,
	help="")
ap.add_argument("--houghtransprocess", type=bool,default=False,
	help="")
ap.add_argument("--watershedprocess", type=bool,default=False,
	help="")
ap.add_argument('filename')
args = vars(ap.parse_args())

time.sleep(2.0)

squaresprocess = args["squaresprocess"]
harrysprocess = args["harrysprocess"]
subpixelharry = args["subpixelharry"]
houghprocess = args["houghprocess"]
houghtransprocess = args["houghtransprocess"]
watershedprocess = args["watershedprocess"]

 
processpix = args["processpix"] 
captcont = args["captcont"]
recvideo = args["recvideo"]
randomize = args["randomize"]
serieslength = args["serieslength"]
Hrmpf. Nå trente jeg en jævla kunstig intelligens til å kjenne igjen frukt bare for å være mrFancypants, så ser jeg at jeg var for langt offtopic til at engang forslaget fikk stå.

Kostet meg en halv jævla dag :P Heldigvis trenger jeg det uansett. Her er noe arbeid fra 2016 der jeg selv akkurat hadde oppdaget argparse og testet ut OpenCV-funksjonalitet.

Kode

import numpy as np
import argparse
import cv2
# construct the argument parse and parse the arguments
ap = argparse.ArgumentParser()
ap.add_argument("-i", "--image", help = "path to the image")
args = vars(ap.parse_args())
image = cv2.imread(args["image"])
...Dette er måten jeg gjør det på når det er bildematriser som er argumentet.

Matplotlib:

NB: Jeg sakset vekk en del nå og må løpe fordi det ser ut som et horehus her og jeg får besøk om sånn 5 min. Men hvis du kjører dette med eksempelvis harmoniske svingninger langs x-aksen så vil du se disse i matplotlibet sin lagrede fil.

Den krever garantert noen fikser av indentering osv, men om du setter deg litt ned med dette så tror jeg du vil finne det å være ganske effektivt og veldig enkelt.

Kode

# import the necessary packages
import numpy as np
import argparse
import cv2
import math
import matplotlib.pyplot as plt

ap = argparse.ArgumentParser()
ap.add_argument("-i", "--image", help = "path to the image")
args = vars(ap.parse_args())
img = cv2.imread(args["image"])

output_image=np.zeros((len(img),len(img[0]),3), np.uint8)

ref = []
ra=np.zeros(3, np.uint8)
ga=np.zeros(3, np.uint8)
ba=np.zeros(3, np.uint8)
re=np.zeros(3, np.uint8)
redref  = []
blueref = []
greenref = []
href = []

def get_h(b,g,r):
	res = 0
	return res
	
xData = np.arange(0, len(img[0]), 1)
print h_pr_pix
alt = 0
h = len(img) -1
l = len(img[0]) -1
camera_feed = cv2.VideoCapture(0)
#for j in range((h + 1)):
#	i = j - 1
#	for k in range(l -1):
#		b = img[i][k][0]
#		g = img[i][k][1]
#		r = img[i][k][2]
	# 	print j,k
	#	output_image[i][k][0] = int(get_h(b,g,r) * h_pr_pix)
	#	print alt
	#	 = alt

xData = np.arange(0, len(img[0]), 1)
#xData = np.arange(0, 255, 1)

yData1 = greenref
ydata2 = blueref
ydata3 = redref

plt.figure(num=1, figsize=(15, 10))
plt.title('Plot 1', size=14)
plt.xlabel('x-axis', size=255)
plt.ylabel('y-axis', size=255)
plt.plot(xData, blueref, color='g', linestyle='-', label='green')
plt.plot(xData, greenref, color='b', linestyle='-', label='blue')
plt.plot(xData, redref, color='r', linestyle='-', label='red')

plt.legend(loc='upper right')
plt.grid(True)
plt.savefig('plot1.png', format='png')
cv2.imshow('iomg',output_image)
Jeg mener enda at den absolutt feteste måten å gjør det du beskriver på er gjennom å trene kunstig intelligens til å bruke Webcam til å føre det inn i matplot'et autonomt. Brukte bare frukt-treningsdatasett som ligger offentlig tilgjengelig, 51 frukter, roasted eller whatnot, trigges via bildebehandling.

Når jeg tenker meg om så er det kanskje litt vel lett å lage butikk ut av det til at jeg gidder å pressse det på folk som ikke er interessert ;D
Sist endret av Tøffetom; 29. august 2019 kl. 23:52. Grunn: Automatisk sammenslåing med etterfølgende innlegg.
Bare for å gi en rask forklaring av den siste. Som du ser så er det der ment å lage en graf som beskriver rødt, grønt og blått som funksjon av piksel-Column. Alle beregningene er jo fjernet, så det du står igjen med vil bare lage data for en.....ingenting, ser jeg, jeg har jo fjerner den delen og. Sorry.

Du er ikke interessert i piksler, så du trenger ikke respektive lister av disse heller. Det som er av interesse her, stå nederst, nærmere bestemt xData. Akkurat syntaksen for å sette xData lik tidsintervall du ønsker kan jeg ikke i hodet, men det er snakk om 2 linjer du finner på første Google.

På yData trenger du jo bare 1 av disse, da du jo bare har 1 variabel. Du kan lage egne yData for alle frukter av interesse, men det virker mye mer fornuftige å lage en egen dictionary der 1 integer kan representere hvilken som helst frukt.

Eneste endringer du egentlig trenger er dette med datetime på x-aksen og å bruke dictionarien som legend. Slik får du en graf som beskriver inntatt frukt som funksjon av tiden.

(Btw så er det kun til enkel bildebehandling som ikke krever performance som jeg gjør i Python. Dette er ikke arbeidet jeg driver å skryter over ved hver anledning, regner med at det er relativt innlysende).
Sist endret av Tøffetom; 31. august 2019 kl. 01:01.