Sida 1 av 2
Python tutorial för att lära sig grunderna?
Postat: 4 januari 2016, 12:49:19
av mippen
Börjat leka lite med Raspberry och märker snabbt att jag saknar grunderna i python.
Finns det ngn bra enkel tutorial att gå för att lära sig just bas kunskaperna?
Med baskunskaper menar jag hur koden är uppbyggd. Vad är main loopen. Hur fungerar tilldelning. Anrop.. mm..
Switch / Case / For etc har man från andra språk.. men fastnar i just hur koden skall partioneras.
Tex:
Jag vill ta emot UDP samtidigt som jag vill lyssna på en GPIO ingång.
Var för sig fungerar men inte tillsammans...
Hur skapar man kod som kan monitorera olika saker?
while True:
# dataFromClient, address = server_socket.recvfrom(256)
# options[dataFromClient]()
if(GPIO.input(17) == 0):
print "Detection"
Re: Python tutorial för att lära sig grunderna?
Postat: 4 januari 2016, 12:53:01
av X-IL
Ja du får väl kanske kolla upp lite grann med trådning alternativt inte ligga och blockera i väntan på din input (bör ju finnas en koll som kan som du har mottagit data, och om det är så, kan du beta av din buffer).
Re: Python tutorial för att lära sig grunderna?
Postat: 4 januari 2016, 12:54:37
av XorXaX
https://www.codecademy.com/learn/python
Interaktivt verktyg för att lära sig Python. Mycket bra!
Re: Python tutorial för att lära sig grunderna?
Postat: 4 januari 2016, 13:04:13
av lillahuset
Re: Python tutorial för att lära sig grunderna?
Postat: 4 januari 2016, 13:04:41
av sodjan
Från:
https://docs.python.org/2/library/socket.html:
"socket.recvfrom(bufsize[, flags])
Receive data from the socket. The return value is a pair (string, address) where string is a
string representing the data received and address is the address of the socket sending the data.
See the Unix manual page recv(2) for the meaning of the optional argument flags; it defaults to zero.
(The format of address depends on the address family — see above.)"
Från:
http://linux.die.net/man/2/recv:
"The flags argument to a recv() call is formed by ORing one or more of the following values:
...
MSG_DONTWAIT (since Linux 2.2)
Enables nonblocking operation; if the operation would block, the call fails with the error EAGAIN or
EWOULDBLOCK (this can also be enabled using the O_NONBLOCK flag with the F_SETFL fcntl(2)).
...
"
Se även "socket.setblocking(flag)" och "socket.settimeout(value)" på Python sidan ovan...
Re: Python tutorial för att lära sig grunderna?
Postat: 4 januari 2016, 13:10:05
av sodjan
> # dataFromClient, address = server_socket.recvfrom(256)
Om jag ser rätt så är flag=256:
198: #define MSG_EOR MSG_EOR
199: MSG_WAITALL = 0x100, /* Wait for a full request. */
Från :
http://repo-genesis3.cbi.utsa.edu/cross ... ket.h.html:
Kod: Markera allt
175: /* Bits in the FLAGS argument to `send', `recv', et al. */
176: enum
177: {
178: MSG_OOB = 0x01, /* Process out-of-band data. */
179: #define MSG_OOB MSG_OOB
180: MSG_PEEK = 0x02, /* Peek at incoming messages. */
181: #define MSG_PEEK MSG_PEEK
182: MSG_DONTROUTE = 0x04, /* Don't use local routing. */
183: #define MSG_DONTROUTE MSG_DONTROUTE
184: #ifdef __USE_GNU
185: /* DECnet uses a different name. */
186: MSG_TRYHARD = MSG_DONTROUTE,
187: # define MSG_TRYHARD MSG_DONTROUTE
188: #endif
189: MSG_CTRUNC = 0x08, /* Control data lost before delivery. */
190: #define MSG_CTRUNC MSG_CTRUNC
191: MSG_PROXY = 0x10, /* Supply or ask second address. */
192: #define MSG_PROXY MSG_PROXY
193: MSG_TRUNC = 0x20,
194: #define MSG_TRUNC MSG_TRUNC
195: MSG_DONTWAIT = 0x40, /* Nonblocking IO. */
196: #define MSG_DONTWAIT MSG_DONTWAIT
197: MSG_EOR = 0x80, /* End of record. */
198: #define MSG_EOR MSG_EOR
199: MSG_WAITALL = 0x100, /* Wait for a full request. */
200: #define MSG_WAITALL MSG_WAITALL
201: MSG_FIN = 0x200,
202: #define MSG_FIN MSG_FIN
203: MSG_SYN = 0x400,
204: #define MSG_SYN MSG_SYN
205: MSG_CONFIRM = 0x800, /* Confirm path validity. */
206: #define MSG_CONFIRM MSG_CONFIRM
207: MSG_RST = 0x1000,
208: #define MSG_RST MSG_RST
209: MSG_ERRQUEUE = 0x2000, /* Fetch message from error queue. */
210: #define MSG_ERRQUEUE MSG_ERRQUEUE
211: MSG_NOSIGNAL = 0x4000, /* Do not generate SIGPIPE. */
212: #define MSG_NOSIGNAL MSG_NOSIGNAL
213: MSG_MORE = 0x8000, /* Sender will send more. */
214: #define MSG_MORE MSG_MORE
Prova med server_socket.recvfrom(64) istället (alltså MSG_DONTWAIT = 0x40, /* Nonblocking IO. */).
Re: Python tutorial för att lära sig grunderna?
Postat: 4 januari 2016, 13:11:01
av sodjan
Jo, detta har ju inte ett smack med Python som sådant att göra...

Re: Python tutorial för att lära sig grunderna?
Postat: 4 januari 2016, 13:18:21
av mippen
Många snabba bra svar. Tackar!
Grundproblem när jag kör båda samtidigt:
Kod: Markera allt
while True:
dataFromClient, address = server_socket.recvfrom(64)
options[dataFromClient]()
if(GPIO.input(17) == 0):
print "Detection"
Ger fel:
if(GPIO.input(17) == 0):
^
IndentationError: unexpected indent
Re: Python tutorial för att lära sig grunderna?
Postat: 4 januari 2016, 13:19:32
av mippen
sodjan skrev:> # dataFromClient, address = server_socket.recvfrom(256)
Om jag ser rätt så är flag=256:
198: #define MSG_EOR MSG_EOR
199: MSG_WAITALL = 0x100, /* Wait for a full request. */
Prova med server_socket.recvfrom(64) istället (alltså MSG_DONTWAIT = 0x40, /* Nonblocking IO. */).
Utgick från att det var mottagningsbuffer inom parantesen.. Hmm..
Re: Python tutorial för att lära sig grunderna?
Postat: 4 januari 2016, 13:34:03
av sodjan
Utgå inte från någonting alls, RTFM...
> IndentationError: unexpected indent
Ja men fixa det då. Det syns ju direkt i rutan ovan.
Re: Python tutorial för att lära sig grunderna?
Postat: 4 januari 2016, 13:35:17
av XorXaX
Kod: Markera allt
if(GPIO.input(17) == 0):
print "Detection"
Du kan inte ha parentes direkt efter if utan mellanslag.
Kod: Markera allt
if (GPIO.input(17) == 0):
print "Detection"
eller
Re: Python tutorial för att lära sig grunderna?
Postat: 4 januari 2016, 13:39:44
av sodjan
> Du kan inte ha parentes direkt efter if utan mellanslag.
??
(Python 2.7.8...)
Re: Python tutorial för att lära sig grunderna?
Postat: 4 januari 2016, 13:41:26
av sodjan
Kod: Markera allt
while True:
dataFromClient, address = server_socket.recvfrom(64)
options[dataFromClient]()
if(GPIO.input(17) == 0):
print "Detection"
Notera att "if" nu ligger i linje med "data" och "options".
Re: Python tutorial för att lära sig grunderna?
Postat: 4 januari 2016, 13:42:54
av mippen
sodjan skrev:Utgå inte från någonting alls, RTFM...
Erkänner att jag inte läste manualen... och att utgå från saker innan är dumt..
sodjan skrev:
"socket.recvfrom(bufsize[, flags])
Säkert feltolkning av mig när det både finns bufsize och flaggor....
sodjan skrev:
> IndentationError: unexpected indent
Ja men fixa det då. Det syns ju direkt i rutan ovan.
Precis därför jag behövde Python for dummies så att jag kan lära mig vad som menas med indent:en....
https://www.codecademy.com/learn/python
Var precis det jag var ute efter.. lättläst, grundlig och tydlig.
Re: Python tutorial för att lära sig grunderna?
Postat: 4 januari 2016, 13:44:27
av sodjan
> Säkert feltolkning av mig när det både finns bufsize och flaggor....
Nej, fel av mig i hastigheten! Det bör nog vara (256, 64).
Default för flags är 0. Jag undrade varför det var 256...
