colourAgga | vrijdag 28 december 2007 @ 17:16 |
Als er dan toch een Perl topic is dan denk ik er toch maar aan om eens een echte mannentaal te introduceren hier op FOK! 
Python! Het geestekindje van Guido van Rossum.
Wie gebruiken Python? - Google, een groot deel van de spiders van Google en hun applicaties zijn in Python geschreven. - Yahoo!Maps - Battlefield 2 - Civilization 4 - ABN Amro - Blender 3D - Paintshop Pro - NASA - Ubuntu Deze lijst gaat eindeloos door, lees meer op: http://wiki.python.org/moin/OrganizationsUsingPython
Wat is Python? Python is een scripting taal die zeer leesbaar is, zeer platform onafhankelijk (van je pc tot je mac tot je mobiele telefoon tot je PSP) en ook zeer snel.
Python Links? http://www.python.org/ http://www.python.org/doc/Intros.html
Python op het web? http://www.djangoproject.com/
Nog meer vragen? Stel ze gerust Ik zal hier binnenkort ook wat code neerzetten. Ik vraag me gewoon af of veel mensen op FOK! ook daadwerkelijk wat doen met Python.
Een voorbeeld Python script om vanaf command line fahrenheit in celsius om te zetten:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | #!/usr/local/bin/python import string, sys
# If no arguments were given, print a helpful message if len( sys.argv ) == 1: print 'Usage: celsius temp1 temp2 ...' sys.exit( 0 )
# Loop over the arguments for i in sys.argv[ 1: ]: try: fahrenheit = float( string.atoi( i ) ) except string.atoi_error: print repr( i ), "not a numeric value" else: celsius = ( fahrenheit - 32 ) * 5.0 /9.0 print '%i\260F = %i\260C' % ( int( fahrenheit ), int( celsius+.5 ) ) |
Deze OP en instructies voor nieuw topic: http://wiki.fok.nl/index.php/OP/Python Mocht je een link vinden die zeker in de OP hoort, twijfel niet en zet hem erbij!
[ Bericht 17% gewijzigd door WyriHaximus op 28-12-2007 23:09:39 ] |
JeOma | vrijdag 28 december 2007 @ 17:45 |
Scripting is voor mietjes.  |
slacker_nl | vrijdag 28 december 2007 @ 17:46 |
quote:Op vrijdag 28 december 2007 17:16 schreef colourAgga het volgende:Nog meer vragen? Stel ze gerust  Ik zal hier binnenkort ook wat code neerzetten. Ik vraag me gewoon af of veel mensen op FOK! ook daadwerkelijk wat doen met Python. Ik zit te denken om Python te gaan leren voor m'n bladelogic tools suite, aangezien ze een python API hebben. Maar aangezien ze ook een shell API hebben, ben ik me eerst daarop gaan focussen. |
shi | vrijdag 28 december 2007 @ 17:58 |
python ftw |
Dr.Daggla | vrijdag 28 december 2007 @ 18:00 |
quote:<Sonium> someone speak python here? <lucky> HHHHHSSSSSHSSS <lucky> SSSSS <Sonium> the programming language . |
colourAgga | vrijdag 28 december 2007 @ 18:46 |
quote: Als jij de voordelen van scriptingtalen niet inziet  |
Farenji | vrijdag 28 december 2007 @ 18:55 |
Ik heb python op mjin mobieltje staan en op mijn pc gebruik ik nicotine, een soulseek client die helemaal in python is geschreven, maar ik kan niet zeggen dat ik er zelf echt al wat mee gedaan heb, al moet het wel een coole taal zijn.... alleen die indenting om blokken aan te geven... brr. |
slakkie | vrijdag 28 december 2007 @ 19:28 |
Moet je echt indenten voor die if/else statements? Lijkt me eerder een voorkeur van de coder.. Haha, het wordt echt afgedwongen door de compiler/taal... |
JeOma | vrijdag 28 december 2007 @ 19:56 |
quote:Op vrijdag 28 december 2007 19:28 schreef slakkie het volgende:Moet je echt indenten voor die if/else statements? Lijkt me eerder een voorkeur van de coder.. Haha, het wordt echt afgedwongen door de compiler/taal... Ik dacht dat alleen COBOL dat had, haha.
Enne, ik zie wel de voordelen van scripting. Maar het is gewoon voor mietjes. Vind ik.  |
colourAgga | vrijdag 28 december 2007 @ 22:24 |
quote:Op vrijdag 28 december 2007 19:28 schreef slakkie het volgende:Moet je echt indenten voor die if/else statements? Lijkt me eerder een voorkeur van de coder.. Haha, het wordt echt afgedwongen door de compiler/taal... Ja, moet Zorgt ook voor wat nettere code, vergeten te indenten of niet correct indenten geeft een parse error  |
marcel-o | vrijdag 28 december 2007 @ 22:59 |
TijdVoorPython 
[ Bericht 1% gewijzigd door marcel-o op 28-12-2007 23:27:02 ] |
SuperRembo | vrijdag 28 december 2007 @ 23:01 |
Hoe werkt die indentation precies? Maakt het uit hoeveel spaties/tabs je gebruikt? Klopt het voorbeeld dan wel? Waarom maak je van een string een integer, en daarna een float? En waarom gebruik je depricated method(s)?
Zomaar een paar vraagjes, ik weet niets van Python  |
WyriHaximus | vrijdag 28 december 2007 @ 23:11 |
Heb ff de OP op de Fok!Wiki gezet en dat ook gelijk ff in de OP aangepast . |
marcel-o | vrijdag 28 december 2007 @ 23:50 |
hier een NL tutorial http://www.coolpython.nl/tutorials/tut/ als de goldstrike is uitgewerkt is, ga ik die eens doornemen
miss. iets voor in de OP? |
Alcatraz | vrijdag 4 januari 2008 @ 15:12 |
Ben er zelf ook sinds kort mee begonnen. Vind zelf 'Beginning Python: From novice to professional' een erg fijn boek. Ook ben ik begonnen met Django. Er is lastig hosting voor te vinden, dus ben er nu mee bezig op mijn eigen Ubuntu servertje.
M.i de voordelen van Python: goed gestructureerd, leesbaar, snel voor een scripttaal, veel librairies, grote community, volledig object georienteerd en bovendien met een Nederlander als geestelijk vader. |
keesjeislief | vrijdag 4 januari 2008 @ 15:36 |
Python rocks . Helaas heb ik (ben geen IT-er) er al een tijdje weinig meer mee gedaan, maar toen ik er destijds mee bezig was vond ik het een heerlijk intuïtieve taal, met talloze geavanceerdere functies al ingebouwd in de standaard library. De vertaalslag van de structuur in je hoofd naar code is verrassend simpel, géén verplichte vage technische toeters en bellen of contra-intuïtieve constructies zoals in Java en C++/C. En de grap is dat het desondanks niet aan mogelijkheden inlevert t.o.v. deze talen (misschien heeft Java meer out there aan frameworks & add-ons). De gemiddelde Java-code heeft een equivalent in Python-code die 10 maal minder regels bevat .
Met het gebruik van indenting om blokken aan te geven heb ik persoonlijk absoluut geen probleem, ik gebruik het ook zoveel mogelijk in andere talen, bevordert m.i. alleen maar de leesbaarheid en het overzicht. |
whoops | maandag 7 januari 2008 @ 16:48 |
Ik ben sinds een week of twee bezig met het bestuderen van het boek Python Power (The Comprehensive Guide) door Matt Teller.
Mijn eerste indruk is erg goed, de taal komt er intuïtief over, en ik hoop dat ik d.m.v. Python eindelijk object oriented programming goed onder de knie krijg... 
Die IDLE editor is ook nice, je probeert je snippets gewoon rechtstreeks in de compiler, en dan zet je ze later om in scripts. Ideaal. Helaas ziet IDLE er erg 1995 uit op een Linux machine, maar dat heeft met Tcl/Tk te maken, het schijnt dat de nieuwe release (8.5) er stukken beter uitziet. |
keesjeislief | maandag 7 januari 2008 @ 18:09 |
Afgelopen weekend heb ik me wat zitten verdiepen in Dabo (www.dabodev.com), een "3-tier framework" dat je kunt importeren in je code (is zelf ook geschreven in Python) en een wrapper vormt om wxPython en een aantal database backends. Het idee is dat je daarmee makkelijker desktop progjes kunt bouwen compleet met GUI en achterliggende database. Ik ben er behoorlijk enthousiast over . Ik weet niet of jullie het met me eens zijn, maar ik vind wxPython een hel. Het produceert een zeer complete en mooie (native) GUI, maar het progranmmeren is rampzalig, wxPython is een vrij dunne wrapper om de wxWidgets code die in C++ is geschreven (is misschien makkelijker als je meer (C++-)ervaring hebt hoor). Wat ik ervan gezien heb, ziet de interface die Dabo beschikbaar stelt er véle malen intuïtiever en makkelijker uit voor iemand die Python gewend is. Verder zijn de drie lagen (database backend, business rules, GUI) natuurlijk op zo'n manier opgezet dat je een hoop standaardwerk wat betreft de communicatie tussen deze drie uit handen wordt genomen.
Op het moment is de 0.8 release uit en het is allemaal nog gedeeltelijk in het opbouwstadium, maar er lijkt zich al een redelijke gerbuikersgroep gevormd te hebben. Het lijkt geknipt voor een progje wat ik al een tijd geleden eens beloofd heb om te maken, ik hoop daar binnenkort eens echt aan te kunnen beginnen en Dabo te kunnen gebruiken . |
whoops | maandag 7 januari 2008 @ 18:10 |
Btw. aangezien ik de built-in theme van de IDLE editor veel te licht vond heb ik deze aangepast, dit is het resultaat:
Voor:

Na:

Hij is gebaseerd op de 'Desert' theme van jEdit.
Deze settings worden opgeslagen in het bestand ~/.idlerc/config-highlight.cfg onder linux en (volgens mij) in c:\.idlerc\config-highlight.cfg onder Windows.
De inhoud van config-highlight.cfg
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 | [desert] keyword-background = #333333 definition-foreground = #98fb98 error-foreground = #ff0000 string-background = #333333 keyword-foreground = #cc4e00 comment-background = #333333 hit-foreground = #ffffff builtin-background = #333333 hilite-foreground = #000000 stdout-foreground = #eeeeee cursor-foreground = #ffcc00 break-background = #ffff55 comment-foreground = #87ceeb hilite-background = #666666 definition-background = #333333 stderr-background = #333333 hit-background = #333333 console-foreground = #87ceeb normal-background = #333333 builtin-foreground = #519e51 stdout-background = #333333 console-background = #333333 stderr-foreground = #ff8800 normal-foreground = #f0e68c string-foreground = #ffa0a0 break-foreground = black error-background = #000000 |
|
whoops | maandag 7 januari 2008 @ 18:14 |
quote: Die staat in de m'n bookmarks! Het ziet er zeker erg interessant uit!  |
whoops | dinsdag 15 januari 2008 @ 00:47 |
Ik heb iets raars met de IDLE editor onder Ubuntu. Als ik heb vanuit het menu opstart krijg ik voor de prompt de volgende melding (zie ook bovenstaande screenshot):quote:IDLE 1.2.1 ==== No Subprocess ==== en is het menuitem 'Shell' niet aanwezig. Niet handig, want het restarten van de shell (Ctrl-F6) werkt dan ook niet meer...
Als ik hem vanaf de terminal opstart, of via Alt-F2 (start-run equiv. in Gnome), krijg ik de melding van het subprocess niet, en is de Shell optie ook aanwezig.
Heeft iemand een idee waar dit aan zou kunnen liggen?
Ik heb het al, een kijkje in de help leverde het volgende op:quote:Running without a subprocess:
If IDLE is started with the -n command line switch it will run in a single process and will not create the subprocess which runs the RPC Python execution server. This can be useful if Python cannot create the subprocess or the RPC socket interface on your platform. However, in this mode user code is not isolated from IDLE itself. Also, the environment is not restarted when Run/Run Module (F5) is selected. If your code has been modified, you must reload() the affected modules and re-import any specific items (e.g. from foo import baz) if the changes are to take effect. For these reasons, it is preferable to run IDLE with the default subprocess if at all possible. En vanuit het menu wordt hij inderdaad met -n opgestart. Snap nogsteeds niet precies waarom je dit nodig zou hebben maar dat wordt vast nog wel duidelijk. 
[ Bericht 25% gewijzigd door whoops op 15-01-2008 00:53:00 ] |
sentiao. | dinsdag 15 januari 2008 @ 10:21 |
quote: Juist ja. Perl wordt toch ook gebruikt als scripttaal? Is PHP ook voor mietjes? En Python kan ook gecompileerde programma's afleveren... Beetje goedkope reactie JeOma.
Het indenten van Python werkt zeer fijn, je hoeft niet meer te letten op { en } of ermee te rotzooien, en het maakt de code een stuk leesbaarder. Python probeert geen dikke soep te zijn qua leesbaarheid, dat staat me wel aan. Perl lijkt echter zijn best te doen om maar niet leesbaar te zijn... EVE-Online is overigens ook geschreven in Python. Als je beginnend programmeur bent dan is Python Echt de beste optie, het is op zijn minst de beste manier om in de wereld van programmeertalen te stappen en om het 'idee' te leren. |
Stranger | dinsdag 15 januari 2008 @ 10:34 |
quote:Op dinsdag 15 januari 2008 10:21 schreef sentiao. het volgende:[..] Het indenten van Python werkt zeer fijn, je hoeft niet meer te letten op { en } of ermee te rotzooien, en het maakt de code een stuk leesbaarder. Python probeert geen dikke soep te zijn qua leesbaarheid, dat staat me wel aan. Perl lijkt echter zijn best te doen om maar niet leesbaar te zijn... Ik ben het juist niet eens met je stelling dat python-code leesbaarder is. Ik vind perl veel leesbaarder, omdat het net iets systematischer is opgebouwd. Je herkent variabelen en arrays, je herkent counters beter, je ziet meteen wanneer welke loop afgelopen is.
Verder vind ik dat je door Python zeer 'lui' wordt, omdat het zoveel accepteert en zo vergevend is. Als je vervolgens Perl gebruikt (een taal die qua gecompliceerdheid misschien nog wel minder is dan python), voor bijvoorbeeld Regex (ja sorry daarvoor is Perl echt 100x beter dan python), moet je weer helemaal inkomen in het 'scriptgevoel', dus netjes de {, } en ; gebruiken. |
sentiao. | dinsdag 15 januari 2008 @ 11:30 |
quote:Op dinsdag 15 januari 2008 10:34 schreef Stranger het volgende:[..] Ik ben het juist niet eens met je stelling dat python-code leesbaarder is. Ik vind perl veel leesbaarder, omdat het net iets systematischer is opgebouwd. Je herkent variabelen en arrays, je herkent counters beter, je ziet meteen wanneer welke loop afgelopen is. Verder vind ik dat je door Python zeer 'lui' wordt, omdat het zoveel accepteert en zo vergevend is. Als je vervolgens Perl gebruikt (een taal die qua gecompliceerdheid misschien nog wel minder is dan python), voor bijvoorbeeld Regex (ja sorry daarvoor is Perl echt 100x beter dan python), moet je weer helemaal inkomen in het 'scriptgevoel', dus netjes de {, } en ; gebruiken. Ik vind het maar moeilijk, een keuze maken. Ik werk momenteel met C# (laat me a.u.b. heel =]) dus ik ben momenteel gewend aan de eindeloze ; en { en }. Welke taal is krachtiger? |
keesjeislief | dinsdag 15 januari 2008 @ 23:34 |
quote:Op dinsdag 15 januari 2008 10:34 schreef Stranger het volgende:[..] Ik ben het juist niet eens met je stelling dat python-code leesbaarder is. Ik vind perl veel leesbaarder, omdat het net iets systematischer is opgebouwd. Je herkent variabelen en arrays, je herkent counters beter, je ziet meteen wanneer welke loop afgelopen is. Ieder z'n mening natuurlijk, maar er zijn maar érg weinig mensen die het met je eens zijn. Geef eens een codevoorbeeld van beide talen waarbij jij Perl leesbaarder vindt?quote:Verder vind ik dat je door Python zeer 'lui' wordt, omdat het zoveel accepteert en zo vergevend is. Als je vervolgens Perl gebruikt (een taal die qua gecompliceerdheid misschien nog wel minder is dan python), voor bijvoorbeeld Regex (ja sorry daarvoor is Perl echt 100x beter dan python), moet je weer helemaal inkomen in het 'scriptgevoel', dus netjes de {, } en ; gebruiken. Jaja. Waarom geen assembly dan? Tik jij je teksten ook nog op een typemachine met de typex binnen handbereik omdat je van een computer zo lui wordt met al die comfortabele knoppen zoals backspace? Oftewel, als er een taal beschikbaar is waarmee je zoveel intuïtiever en leesbaarder tot je doel kunt komen, en die je ook nog eens niet lastigvalt met allerlei overbodig tikwerk om je in principe al werkende code in een of ander afgedwongen stringent jasje te krijgen ("zoveel accepteert en zo vergevend is"), waarom zou je dan überhaupt nog denken aan teruggaan?  |
keesjeislief | dinsdag 15 januari 2008 @ 23:46 |
quote:Op dinsdag 15 januari 2008 11:30 schreef sentiao. het volgende:[..] Ik vind het maar moeilijk, een keuze maken. Ik werk momenteel met C# (laat me a.u.b. heel =]) dus ik ben momenteel gewend aan de eindeloze ; en { en }. Welke taal is krachtiger? Ik ben niet bekend met C# moet ik je zeggen. Maar ik zou me niet zo druk maken als ik jou was. De tendens de laatste jaren is een shift richting een nieuwe generatie talen zoals Python en Ruby. Daar zijn een hele berg uitstekende redenen voor, waarbij de rode draad is het gebruikersgemak (je schrijft bijna pseudo-code) in combinatie met de grote kracht van de talen qua mogelijkheden. Mocht je dan tegen iets aanlopen wat je toch liever in een andere taal schrijft, om wat voor reden dan ook, dan is dit geruststellend om te weten:quote:Python plays well with others
Python can integrate with COM, .NET, and CORBA objects.
For Java libraries, use Jython, an implementation of Python for the Java Virtual Machine.
For .NET, try IronPython , Microsoft's new implementation of Python for .NET, or Python for .NET.
Python is also supported for the Internet Communications Engine (ICE) and many other integration technologies.
If you find something that Python cannot do, or if you need the performance advantage of low-level code, you can write extension modules in C or C++, or wrap existing code with SWIG or Boost.Python. Wrapped modules appear to your program exactly like native Python code. That's language integration made easy. You can also go the opposite route and embed Python in your own application, providing your users with a language they'll enjoy using. |
sentiao. | woensdag 16 januari 2008 @ 09:56 |
Een taal die geschikt is voor zowel beginners als experts, prachtig .
Maar hoe zit het met de scene (*engels uitspreken) van Python? Perl is haast een religie geworden, en ook dat is wat ik zoek in een taal.
[speculatief] Als ik het uberhaubt zou doen dan zou ik liever een t-shirt dragen met een stukje Perl code dan met een stukje Python code erop, ik vraag me uberhaubt af of je goed kan zien dat het Python code is (door de pseudo-code-heid). [/speculatief] Snappen jullie wat ik bedoel?
Uiteraard lachen we Perl programmeurs weer uit zodra de pauze om is en we weer aan het werk moeten . |
FastFox91 | woensdag 16 januari 2008 @ 12:11 |
Voordat ik deze taal ga leren, wil ik weten hoe ik mijn programmatje/scriptje kan laten draaien op een andere computer. Compilen is dat toch? Hoe doe ik dat? |
slacker_nl | woensdag 16 januari 2008 @ 12:37 |
quote:Op woensdag 16 januari 2008 12:11 schreef FastFox91 het volgende:Voordat ik deze taal ga leren, wil ik weten hoe ik mijn programmatje/scriptje kan laten draaien op een andere computer. Compilen is dat toch? Hoe doe ik dat? Ik zou eens hier kijken: http://docs.python.org/tut/tut.html |
whoops | woensdag 16 januari 2008 @ 13:50 |
quote:Op woensdag 16 januari 2008 12:11 schreef FastFox91 het volgende:Voordat ik deze taal ga leren, wil ik weten hoe ik mijn programmatje/scriptje kan laten draaien op een andere computer. Compilen is dat toch? Hoe doe ik dat? Python kan compilen, maar over het algemeen worden de scripts geinterpreteerd en dan uitgevoerd. Je kan de scripts dus ongewijzigd draaien, op elk OS dat Python ondersteunt. En dat zijn er erg veel.  |
sentiao. | woensdag 16 januari 2008 @ 14:36 |
quote:Op woensdag 16 januari 2008 13:50 schreef whoops het volgende:[..] Python kan compilen, maar over het algemeen worden de scripts geinterpreteerd en dan uitgevoerd. Je kan de scripts dus ongewijzigd draaien, op elk OS dat Python ondersteunt. En dat zijn er erg veel.  Helaas Windows niet, toch? |
slacker_nl | woensdag 16 januari 2008 @ 15:54 |
Lijkt me dat als MS een Phython voor .Net kent dat het ook onder Windows draait... En zie hier: http://www.python.org/download/windows/ |
keesjeislief | woensdag 16 januari 2008 @ 16:32 |
quote:Op woensdag 16 januari 2008 12:11 schreef FastFox91 het volgende:Voordat ik deze taal ga leren, wil ik weten hoe ik mijn programmatje/scriptje kan laten draaien op een andere computer. Compilen is dat toch? Hoe doe ik dat? Python werkt, net als Java en talen op .NET etc., met een virtual machine. Je code (bla.py) wordt in een eerste vertaalslag omgezet naar bytecode (bla.pyc) die door die virtual machine gerund kan worden (vergelijkbaar met compilen van C-code naar low-level instructies die 'direct' door een OS gerund kan worden). De volgende keer dat je het programma runt wordt, als je niets aan de oorspronkelijke code hebt veranderd, deze eerste stap overgeslagen en meteen de bytecode aan de VM gevoerd. |
keesjeislief | woensdag 16 januari 2008 @ 16:35 |
quote: Tuurlijk wel, hoe kom je daar nou bij? . Van python.org:quote:Python runs everywhere
Python is available for all major operating systems: Windows, Linux/Unix, OS/2, Mac, Amiga, among others. There are even versions that runs on .NET, the Java virtual machine, and Nokia Series 60 cell phones. You'll be pleased to know that the same source code will run unchanged across all implementations.
Your favorite system isn't listed here? It may still support Python if there's a C compiler for it. Ask around on news:comp.lang.python - or just try compiling Python yourself. |
FlexelF | donderdag 17 januari 2008 @ 12:30 |
Ik vind Python een heerlijke taal, ben nu bezig met een beginnetje maken binnen het OOP (Object Oriented Programming) en dan nu met name de inheritance van klassen, erg leuk  |
Siegfried | dinsdag 29 januari 2008 @ 14:10 |
quote: |
slacker_nl | donderdag 15 mei 2008 @ 11:59 |
Even een kick, aangezien ik nu echt actief ben begonnen met Python.. |
PaRaR | woensdag 4 juni 2008 @ 19:15 |
Probleempje: Ik probeer MySQL in Python 2.5 te krijgen(module stijl). Ik krijg het echter niet voor mekaar om dit simpel te doen terwijl ik de benodigde mysql bestanden wel heb. Heeft iemand een simpele uitleg of tutorial voor dit probleem ? Hoe krijg ik MySQL aan de praat met Python 2.5 in Windows ? |
slakkie | woensdag 4 juni 2008 @ 19:18 |
http://sourceforge.net/projects/mysql-python
Google: mysql python windows
Good luck. |
Dzy | donderdag 5 juni 2008 @ 15:18 |
TVP, ga beginnen met python omdat mijn nieuwe N95-8gb morgen binnenkomt. Je kunt heel mooi Python gebruiken om op de S60 chipset 3rd edition van Nokia te programmeren. |
R-Mon | donderdag 5 juni 2008 @ 15:26 |
Ooit mee gespeeld [Python] voor dummies |
PaRaR | dinsdag 10 juni 2008 @ 23:33 |
quote: Bedankt voor je reactie. Ik heb alles al bekeken en geprobeerd, maar het lijkt ongelijk mysql met python te verbinden op een of andere manier. Zijn er toevallig ook complete installatie pakketten die python en mysql installeren op windows ?
Alvast bedankt! |
Farenji | dinsdag 10 juni 2008 @ 23:41 |
quote:Op dinsdag 10 juni 2008 23:33 schreef PaRaR het volgende:[..] Bedankt voor je reactie. Ik heb alles al bekeken en geprobeerd, maar het lijkt ongelijk mysql met python te verbinden op een of andere manier. Zijn er toevallig ook complete installatie pakketten die python en mysql installeren op windows ? Alvast bedankt! Met "het lukt niet" ("het lijkt ongelijk"?? ) kom je er niet. Als iets niet lukt dan vermeld je wat er precies niet lukt en welke foutmelding(en) je krijgt, wat je allemaal precies geprobeerd hebt om het wel te laten lukken, en waar je vastloopt. Misschien kunnen we dan helpen. Nu niet. |
Dzy | dinsdag 10 juni 2008 @ 23:44 |
Ik ben wat dingetjes aan het uitproberen met Python voor Symbian 60 telefoons, die API gebruiken. Werkt best makkelijk en ik heb zelfs een redelijke python IDE op m'n N95 zelf. |
whoops | woensdag 11 juni 2008 @ 14:01 |
quote:Op dinsdag 10 juni 2008 23:44 schreef Dzy het volgende:Ik ben wat dingetjes aan het uitproberen met Python voor Symbian 60 telefoons, die API gebruiken. Werkt best makkelijk en ik heb zelfs een redelijke python IDE op m'n N95 zelf. Klinkt interessant... Welke IDE is dat dan? Ik heb alleen de Python runtime en shell (standaard Python install) op m'n S60 telefoon (Nokia E50)... |
Dzy | woensdag 11 juni 2008 @ 15:14 |
http://masteranza.wordpre(...)hon-on-mobile-s60v3/
PED is de IDE, werkt best redelijk. Alleen blijft het kut als je op het T9 tobo moet typen dus een bluetooth tobo is wel aan te raden  |
whoops | woensdag 11 juni 2008 @ 17:22 |
quote: Oke, dit ziet er wel nice uit... Het lijkt me inderdaad niet handig om complete apps mee te schrijven, maar het is wel mooi om even wat mee te experimenteren...  |
PaRaR | woensdag 11 juni 2008 @ 19:41 |
quote:Op dinsdag 10 juni 2008 23:41 schreef Farenji het volgende:[..] Met "het lukt niet" ("het lijkt ongelijk"??  ) kom je er niet. Als iets niet lukt dan vermeld je wat er precies niet lukt en welke foutmelding(en) je krijgt, wat je allemaal precies geprobeerd hebt om het wel te laten lukken, en waar je vastloopt. Misschien kunnen we dan helpen. Nu niet. Het implementeren van de mysql for python2.5 module. Hoe krijg ik dat voor mekaar? |
Dzy | woensdag 11 juni 2008 @ 19:48 |
quote:Op woensdag 11 juni 2008 17:22 schreef whoops het volgende:[..] Oke, dit ziet er wel nice uit... Het lijkt me inderdaad niet handig om complete apps mee te schrijven, maar het is wel mooi om even wat mee te experimenteren... Precies  |
PaRaR | zaterdag 14 juni 2008 @ 23:33 |
Nouja, ik heb het voor mekaar. Nu zit ik met het volgende probleem(alhoewel ik niet zeker weet of het een Python probleem is): Het script runt goed, geen fouten. Hij moet alleen data verwerken in een tabel. Dit gebeurt echt niet. Ik krijg geen enkele foutmelding. Heeft een van jullie een idee hoe ik er achter kan komen wat de fout kan zijn mbt database instellingen/firewall of iets anders? Ik zie ook niks in mijn mysql log, hoe kan dit nou? |
Libris | zondag 22 juni 2008 @ 12:06 |
Heb je wat code?
Tevens Schopje |
Farenji | zondag 22 juni 2008 @ 13:00 |
Het is officieel: Python is kut.
Ik was net heel even aan het spelen met dit stukje code: Wat devven we vandaag? Deel 2 Gewoon een copy/paste, en toen wilde ik even een regeltje toevoegen. Kreeg ik deze foutmelding:
1 | IndentationError: unindent does not match any outer indentation level |
Probleem was dus dat de indents in de code uit 4 spaties bestonden, en de indent die mijn editor toevoegde uit een tab bestond, die toevallig hetzelfde eruitziet als 4 spaties. En daar verslikt python zich blijkbaar al in. :r
Ik heb die indentation die bepalend is voor syntax en werking van je programma altijd al een Slecht Idee gevonden en nu weet ik het zeker. Ik zie de problemen al voor me als je met meerdere mensen en verschillende editors aan dezelfde code werkt, wat een nachtmerrie gaat dat worden. Voor mij geen python, er is voor mij sowieso geen reden om daar tijd aan te verliezen, ik hou het wel gewoon bij perl. Veel beter. |
slakkie | zondag 22 juni 2008 @ 21:23 |
Moet zeggen dat ik wel onder de indruk ben van python. Vind het wel een prettige taal om in te proggen (lekkerder dan PHP bijv.). De indentation is vooral in het begin wennen, maar dat is een kwestie van tijd.
Als je met python werkt weet je dat je indentation cruciaal is voor de uitvoer en moet je gewoon een goede editor pakken zodat je je geen zorgen hoeft te maken over het editten van .py files.. Ik heb er zelf geen problemen mee gehad, wellicht omdat mijn tab/shiftwidth onder vim hetzelfde zijn als Python voorschrijft. Geen problemen mee dus. In de interactieve python shell vind ik het bij vlagen irritant.
Python  |
Libris | maandag 23 juni 2008 @ 13:40 |
quote:Op zondag 22 juni 2008 21:23 schreef slakkie het volgende:Moet zeggen dat ik wel onder de indruk ben van python. Vind het wel een prettige taal om in te proggen (lekkerder dan PHP bijv.). De indentation is vooral in het begin wennen, maar dat is een kwestie van tijd. Als je met python werkt weet je dat je indentation cruciaal is voor de uitvoer en moet je gewoon een goede editor pakken zodat je je geen zorgen hoeft te maken over het editten van .py files.. Ik heb er zelf geen problemen mee gehad, wellicht omdat mijn tab/shiftwidth onder vim hetzelfde zijn als Python voorschrijft. Geen problemen mee dus. In de interactieve python shell vind ik het bij vlagen irritant. [ afbeelding ] Python [ afbeelding ] Ik heb collega's die die shell vaak gebruiken, ik kan er ook niet mee werken. Ik snap niet wat de voordelen zijn ten opzichte can een normale editor (zoals Eclipse), of zelfs notepad. |
Iblis | maandag 23 juni 2008 @ 13:59 |
quote:Op zondag 22 juni 2008 13:00 schreef Farenji het volgende:Probleem was dus dat de indents in de code uit 4 spaties bestonden, en de indent die mijn editor toevoegde uit een tab bestond, die toevallig hetzelfde eruitziet als 4 spaties. En daar verslikt python zich blijkbaar al in.  Of 8 spaties. Dat hangt van je editor af. Of twee spaties. Of 3. Onder Unix is de standaard 8 spaties. Het wordt sterk afgeraden om spaties en tabs door elkaar te gebruiken, en dat geldt niet alleen voor Python (waar het errors geeft) maar ook voor C of Perl. Als jij je file netjes hebt opgemaakt, met 8 spaties voor een tab en omgekeerd, maar de tabs en spaties door elkaar gebruikt dan krijgt iemand anders die het bestand opent een chaos te zien. Kortom, een editor die spaties en tabs zo door elkaar gebruikt is een Slecht Idee.
Pythons manual zegt dan ook:quote:Cross-platform compatibility note: because of the nature of text editors on non-UNIX platforms, it is unwise to use a mixture of spaces and tabs for the indentation in a single source file. It should also be noted that different platforms may explicitly limit the maximum indentation level. quote:Ik heb die indentation die bepalend is voor syntax en werking van je programma altijd al een Slecht Idee gevonden en nu weet ik het zeker. Ik zie de problemen al voor me als je met meerdere mensen en verschillende editors aan dezelfde code werkt, wat een nachtmerrie gaat dat worden. Voor mij geen python, er is voor mij sowieso geen reden om daar tijd aan te verliezen, ik hou het wel gewoon bij perl. Veel beter. Zoals gezegd, je krijgt dezelfde problemen in willekeurig welke taal als het om onderhoud van je source gaat. Als je met een groep samenwerkt en er wordt geen afspraak gemaakt over tab/spaties dan krijg je, ongeacht welke taal je gebruikt, ontzettend lelijke source-code doordat vroeg of laat iemand spaties door tabs gaat vervangen of omgekeerd. |
slacker_nl | maandag 23 juni 2008 @ 14:02 |
quote:Op maandag 23 juni 2008 13:40 schreef Libris het volgende:[..] Ik heb collega's die die shell vaak gebruiken, ik kan er ook niet mee werken. Ik snap niet wat de voordelen zijn ten opzichte can een normale editor (zoals Eclipse), of zelfs notepad. Voordeel is dat je snel een functie kan prototypen enzo. ff kijken of dit en dit zo werkt. heb hem zelf altijd open om help(func) of dir(var) te doen. |
Iblis | maandag 23 juni 2008 @ 14:04 |
quote:Op maandag 23 juni 2008 13:40 schreef Libris het volgende:Ik heb collega's die die shell vaak gebruiken, ik kan er ook niet mee werken. Ik snap niet wat de voordelen zijn ten opzichte can een normale editor (zoals Eclipse), of zelfs notepad. De Python-shell of vi? De Pythonshell heeft als voordeel dat je snel wat constructies kunt uittesten om te zien of ze werken, of je laadt een module, en je kunt met tab-completion (dat heeft de shell) even de attributen opzoeken, en snel een regeltje of constructie testen. Ik heb meestal wel een python shell open om snel iets uit te zoeken.
En wat vi betreft… dat blijft simpelweg een voorkeur, een editor als vi is heel krachtig als je ermee om kunt gaan (veel krachtiger dan Notepad bijvoorbeeld). |
PaRaR | dinsdag 24 juni 2008 @ 18:18 |
quote: Uiteraard:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | allmatches = set() conn = MySQLdb.connect("localhost", "root", "", "espn") cs = conn.cursor() cs.execute("SELECT match_id FROM all_match WHERE league = '%s'" % (league)) row = cs.fetchone() while row != None: allmatches.add(row[0]) row = cs.fetchone()
allsql = []
conn = MySQLdb.connect("localhost", "root", "", "espn") cs = conn.cursor() for sql in allsql: cs.execute(sql) conn.close() |
Dit is het stukje dat de informatie die ik krijg in m'n DB moet zetten. Uiteraard heb ik user en wachtwoord even weggehaald. Als ik het script run dan krijg ik hier geen fouten mee. Dus hij connect wel. Hij schrijft alleen niks weg. Ik ben er nog steeds niet achter wat het nou is. Heeft iemand nog slimme tips om te kijken tot hoever de uitvoer van de sql gegevens komt o.i.d. ?
Alvast bedankt mensen  |
Iblis | dinsdag 24 juni 2008 @ 18:24 |
quote:Op dinsdag 24 juni 2008 18:18 schreef PaRaR het volgende:Uiteraard: [ code verwijderd ] Dit is het stukje dat de informatie die ik krijg in m'n DB moet zetten. Uiteraard heb ik root en wachtwoord even weggehaald. Als ik het script run dan krijg ik hier geen fouten mee. Dus hij connect wel. Hij schrijft alleen niks weg. Ik ben er nog steeds niet achter wat het nou is. Heeft iemand nog slimme tips om te kijken tot hoever de uitvoer van de sql gegevens komt o.i.d. ? Alvast bedankt mensen  Hoe bedoel je wegschrijven? Je zou in de loop een print kunnen zetten. Dan kun je zien hoe vaak het daar doorheen komt. Ook kun je b.v. de boel in een script zetten tot row = cs.fetchone() en dan met python -i het script draaien, waarna je de boel kunt inspecteren in de shell (kun je kijken wat row is,etc.)
Overigens is ‘while row:’ beter Python-idioom dan ‘while row != None’. |
slacker_nl | dinsdag 24 juni 2008 @ 19:15 |
Kan je niet beter while row = cs.fetchone(): doen? |
Iblis | dinsdag 24 juni 2008 @ 19:36 |
quote: Nee, dat is C-idioom en werkt expres niet in Python. Het geeft een syntax error. Je kunt geen toekenning binnen een conditie doen. De reden hiervoor is dat het ten eerste een beetje obscuur is, en ten tweede vaak de bug if (x = 3) vangt terwijl je (x == 3) wilde doen. Het staat ook in de FAQ |
slacker_nl | dinsdag 24 juni 2008 @ 19:49 |
Dan zou ik het zo doen:
1 2 3 4 | while True: row = cs.fetchone() if row == None: break # do stuff |
Ik vind die row = fetchone, en de while loop met de fetchone erin lelijk staan. |
PaRaR | woensdag 25 juni 2008 @ 19:21 |
quote:Op dinsdag 24 juni 2008 18:24 schreef Iblis het volgende:[..] Hoe bedoel je wegschrijven? Je zou in de loop een print kunnen zetten. Dan kun je zien hoe vaak het daar doorheen komt. Ook kun je b.v. de boel in een script zetten tot row = cs.fetchone() en dan met python -i het script draaien, waarna je de boel kunt inspecteren in de shell (kun je kijken wat row is,etc.) Overigens is ‘while row:’ beter Python-idioom dan ‘while row != None’. Met wegschrijven bedoel ik het INSERT-en in m'n tabel. De rest van je tips ga ik nu uitproberen. |
slacker_nl | maandag 18 augustus 2008 @ 11:51 |
Iemand bekend met happydoc?
Ik heb een file PyCli.py
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 | #!/usr/bin/env bljython
import os import bladelogic.cli.CLI as blcli
class PyCli:
def __init__(self): """Initilize a JLI connection""" self.jli = blcli.CLI() self.jli.connect()
def cmd(self, cmd): """Execute a command with jli, returns a string on succes, None on failure""" result = self.jli.run(cmd) if result.success(): return result.returnValue else: print result.getError() return None |
Nu draai ik happydoc over deze file, maar hij geeft de docstring niet weer in de gegenereerde documentatie.. En dat moet ie wel gaan doen.. Iemand een tip cq oplossing? |
slacker_nl | woensdag 20 augustus 2008 @ 17:42 |
Python is best ok, maar #python wordt bewaakt door een anal opper:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 | 17:27 <slacker_nl> lol 17:27 <Yhg1s> slacker_nl: please mind the rules. 17:28 <slacker_nl> Yhg1s: ? 17:28 <Yhg1s> slacker_nl: notice the topic. 17:28 <slacker_nl> lol @ no lol 17:29 <sproingie> someone's asking for it 17:29 <nopper> what for lol? 17:29 <Yhg1s> sigh. 17:29 <nopper> :D 17:29 <sproingie> Yhg1s: kids these days 17:29 <slacker_nl> ok ok, i will rofl then 17:29 <Yhg1s> slacker_nl: or you can just not type anything. 17:29 <nopper> lmao is officially supported? 17:29 <Yhg1s> no. 17:29 <slacker_nl> also an option, having a bad day? 17:29 <Yhg1s> retarded comments in general are strongly discouraged. forcefully, if necessary. 17:30 <nopper> i've to wait next release? 17:30 <Yhg1s> what we value is not the words you use, but the signal to noise ratio. Which is currently in a steep decline. 17:30 <nopper> i could have a noise-o-meter? 17:31 <slacker_nl> nopper, i want one as well 17:31 <nopper> yeah i'm waiting for Yhg1s 17:32 <slacker_nl> nopper, just say laughin out load as a tla and he will notice you 17:32 <Yhg1s> slacker_nl, nopper: or I can just ban you, if you prefer. 17:34 <slacker_nl> Yhg1s: you are having a bad day... 17:34 <Yhg1s> slacker_nl: nope. |
|
slacker_nl | maandag 25 augustus 2008 @ 18:23 |
Kan iemand me even helpen met het dynamisch laden van modules:
Ik wil namelijk alle files uit een directory importeren, instances aan te maken en wat stuff mee te doen:
ala:
1 2 3 4 5 | for file in dir: # Strip .py from file import OSS.bladelogic.file k = file.file() k.do_stuff() |
|
Iblis | maandag 25 augustus 2008 @ 19:34 |
quote:Op maandag 25 augustus 2008 18:23 schreef slacker_nl het volgende:Kan iemand me even helpen met het dynamisch laden van modules: Ik wil namelijk alle files uit een directory importeren, instances aan te maken en wat stuff mee te doen: ala: [ code verwijderd ] Wat je wilt gebruiken is __import__. Zie hier een proof of concept:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | import os
BASE='test' for filename in os.listdir(BASE): if not filename.endswith('.py'): continue filename = filename[:-3] # De fromlist zorgt ervoor dat je als module direct filename krijgt, # en niet 'BASE'. Stel dat je BASE/foo.py hebt, dan zou je zonder # fromlist hebben dat je mod.foo.bar moet hebben als bar een class # in foo is. Dit voorkomt dat. Eventueel kan het wel, maar dan moet # je herhaaldelijk getattr aanroepen, gebaseerd op de string BASE.filename. mod = __import__('%s.%s' % (BASE, filename), fromlist=filename) # Test is de naam van de klasse c = getattr(mod, 'Test') # Dit is de instantie o = c() # En roep de functie aan. o.hello() |
In de directory test heb ik een paar bestanden staan, die allemaal de volgende inhoud hebben:
1 2 3 | class Test: def hello(self): print "Hello from %s." % __file__ |
Deze worden stuk voor stuk geladen, een instantie wordt gemaakt en hello() wordt aangeroepen. Eventueel kan dat ook dynamischer natuurlijk door middel van getattr. Ook een functie als hasattr kan je van dienst zijn. De uitvoer is nu iets als:
Hello from /home/Iblis/tmp/test/bar.pyc. Hello from /home/Iblis/tmp/test/baz.pyc. Hello from /home/Iblis/tmp/test/foo.pyc. Hello from /home/Iblis/tmp/test/test.pyc.
Let dus op het probleem dat je kun hebben als je diep genest importeert, zoals OSS.bladelogic, dat je een paar keer recursief getattr moet doen, of de fromlist moet gebruiken, maar dat staat ook in de documentatie. |
Iblis | maandag 25 augustus 2008 @ 19:36 |
En je kunt nog verder gaan met de IMP module waarmee je in feite je eigen definitie van __import__ zou kunnen schrijven als je dat zou willen. |
slakkie | maandag 25 augustus 2008 @ 20:37 |
Thank you, heb er dit van gemaakt:
1 2 3 4 5 6 7 8 9 10 11 12 | def load_modules(dir, module_prefix): for filename in os.listdir(dir): if not filename.endswith('.py') or not filename[0:1].isupper(): continue
file = filename[:-3] mod = __import__('%s.%s' % (module_prefix, file), fromlist=filename) c = getattr(mod, file) o = c() info(o)
load_modules("/home/wesleys/sbox/blpython/src/lib/OSS/bladelogic", "OSS.bladelogic") |
Had het nodig om alle functies uit de verschillende klasses te printen. De info functie print de verschillende functies uit en de bijbehorende doc strings.
Overigens werkt de __import__ functie niet met jython (v2.2.1).
[ Bericht 2% gewijzigd door slakkie op 25-08-2008 20:53:54 ] |
slacker_nl | woensdag 27 augustus 2008 @ 05:49 |
quote: En het werkt nu ook onder jython:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 | def load_modules(dir, module_prefix = None): files = os.listdir(dir) files.sort() for filename in files: if not filename.endswith('.py') or not filename[0:1].isupper(): continue
filename = filename[:-3] if module_prefix == None: module_name = filename else: module_name = '%s.%s' % (module_prefix, filename)
# Work around for http://bugs.jython.org/issue1111 # mod = __import__(modules, {}, {}, [ filename ], -1) mod = __import__(module_name) components = module_name.split('.') for comp in components[1:]: mod = getattr(mod, comp)
c = getattr(mod, filename) o = c() info(o) |
|
DennisMoore | vrijdag 19 september 2008 @ 18:41 |
Pfff... ik heb (als leek met XP) Python geïnstalleerd, en Apache... en probeer nu mod_python aan de gang te krijgen ivm Django, maar het lukt niet .
Apache kan de module niet importeren, denk ik.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | Starting the Apache2.2 service The Apache2.2 service is running. ] Apache/2.2.9 (Win32) configured -- resuming normal operations [Fri Sep 19 18:38:47 2008] [notice] Server built: Jun 13 2008 04:04:59 [Fri Sep 19 18:38:47 2008] [notice] Parent: Created child process 560 [Fri Sep 19 18:38:47 2008] [error] python_init: Python version mismatch, expected '2.5', found '2.5.2'. [Fri Sep 19 18:38:47 2008] [error] python_init: Python executable found 'C:\\webroot\\bin\\httpd.exe'. [Fri Sep 19 18:38:47 2008] [error] python_init: Python path being used 'c:\\Python25\\python25.zip;.\\DLLs;.\\lib;.\\lib\\plat-win;.\\lib\\lib-tk;C:\\webroot\\bin'. [Fri Sep 19 18:38:47 2008] [notice] mod_python: Creating 8 session mutexes based on 0 max processes and 64 max threads. [Fri Sep 19 18:38:47 2008] [notice] Child 560: Child process is running [Fri Sep 19 18:38:47 2008] [notice] Child 560: Acquired the start mutex. [Fri Sep 19 18:38:47 2008] [notice] Child 560: Starting 64 worker threads. [Fri Sep 19 18:38:47 2008] [notice] Child 560: Starting thread to listen on port 80. [Fri Sep 19 18:40:26 2008] [error] make_obcallback: could not import mod_python.apache.\n 'import site' failed; use -v for traceback 'import site' failed; use -v for traceback ImportError: No module named mod_python.apache [Fri Sep 19 18:40:26 2008] [error] make_obcallback: Python path being used "['c:\\\\Python25\\\\python25.zip', '.\\\\DLLs', '.\\\\lib', '.\\\\lib\\\\plat-win', '.\\\\lib\\\\lib-tk', 'C:\\\\webroot\\\\bin']". [Fri Sep 19 18:40:26 2008] [error] get_interpreter: no interpreter callback found. [Fri Sep 19 18:40:26 2008] [error] [client 127.0.0.1] python_handler: Can't get/create interpreter., referer: http://localhost/test/ |
'k Dacht dat ik toch alles netjes volgens de tutorial/installatie-dinges had gedaan... |
Clyde_Frog | donderdag 20 november 2008 @ 22:18 |
Schop.
Python op beginnersniveau vraag:
Ik ben een class aan het schrijven. Deze bevat enkele functies. Nu wil ik van 1 van de functies het resultaat vastleggen in een string, zodat (wanneer ik de class importeer naar een ander document) deze kan oproepen. Ik heb gelezen dat dit kan door return className(naamString) aan het eind van je functie te schrijven, maar dit werkt niet. Dit is wellicht een cryptische omschrijving, maar hoop dat het een beetje duidelijk is en iemand weet hoe dit mogelijk is. |
Iblis | donderdag 20 november 2008 @ 22:22 |
Ik snap niet helemaal wat je wilt eerlijk gezegd. Stel ik heb een bestand spam.py:
1 2 3 4 5 | class spam: def eggs(self): x = 1 + 2 r = str(x) return r |
Dan kan ik in Python doen:
1 2 3 4 | >>> import spam >>> s = spam.spam() >>> s.eggs() '3' |
Is dat wat je wilt? Of wanneer wil je precies die string tevoorschijn toveren? |
Clyde_Frog | donderdag 20 november 2008 @ 22:33 |
Wow, snelle reactie!
Het is niet helemaal wat ik bedoel.
1 2 3 4 5 6 7 8 | class spam def comp(self, s): self.change=list(s) reversed=self.change.reverse() stringreversed="".join(reversed) print "Reversed version", stringreversed return Sequence(stringreversed) |
Dat laatste is het probleem. Ik wil die string namelijk ook kunnen oproepen wanneer ik in een andere functie zit te werken. |
Iblis | donderdag 20 november 2008 @ 22:42 |
quote: Op donderdag 20 november 2008 22:33 schreef Clyde_Frog het volgende:Wow, snelle reactie! Het is niet helemaal wat ik bedoel. [ code verwijderd ] Dat laatste is het probleem. Ik wil die string namelijk ook kunnen oproepen wanneer ik in een andere functie zit te werken. Maar je wilt dus dat die comp() de laatste input opslaat? Dus je roept ergens comp('1234') aan, het resultaat hiervan ('4321') wordt opgeslagen en je kunt 100 regels verder over dit laatste resultaat beschikken? |
Clyde_Frog | donderdag 20 november 2008 @ 22:45 |
Psies. :$ Of ik zou alles in 1 functie moeten zetten zodat ik dat niet hoeft te doen, maar dat wordt een beetje lastig. |
Iblis | donderdag 20 november 2008 @ 22:52 |
quote: Op donderdag 20 november 2008 22:45 schreef Clyde_Frog het volgende:Psies. :$ Of ik zou alles in 1 functie moeten zetten zodat ik dat niet hoeft te doen, maar dat wordt een beetje lastig. Het is meestal geen teken van een goed programmeerontwerp als je zoiets wilt doen. Meestal is het duidelijker dat je variabele meegeeft waarin je het resultaat bewaart, maar zoiets zou kunnen:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | class spam: def __init__(self): self.revstr = ''
def comp(self, s): self.revstr = ''.join(list(s)[::-1]) return self.revstr
s = spam() t = spam() print s.comp('123') print t.comp('456') print "Nu iets anders" print t.revstr print "Nog iets anders." print s.revstr |
Elke instantie krijgt dus een variabele als je namelijk:
1 2 3 | class spam: revstr = '' .... |
doet creëer je een klasse-variabele, dat wil je niet. Die wordt gedeeld tussen alle instanties. Verder moet je er rekening mee houden dat de reverse() call ‘in-place’ is, dus reversed=self.change.reverse() verandert self.change, en kent niet het resultaat toe aan reversed. Ik gebruik een slice om direct de reveral te doen, maar enfin… |
#ANONIEM | donderdag 20 november 2008 @ 22:57 |
Python
tevens TVP ! |
Clyde_Frog | donderdag 20 november 2008 @ 23:09 |
quote:Op donderdag 20 november 2008 22:52 schreef Iblis het volgende:[..] Het is meestal geen teken van een goed programmeerontwerp als je zoiets wilt doen. Meestal is het duidelijker dat je variabele meegeeft waarin je het resultaat bewaart, maar zoiets zou kunnen: [ code verwijderd ] Elke instantie krijgt dus een variabele als je namelijk: [ code verwijderd ] doet creëer je een klasse-variabele, dat wil je niet. Die wordt gedeeld tussen alle instanties. Verder moet je er rekening mee houden dat de reverse() call ‘in-place’ is, dus reversed=self.change.reverse() verandert self.change, en kent niet het resultaat toe aan reversed. Ik gebruik een slice om direct de reveral te doen, maar enfin… Ja klopt , ik heb het in mn originele programma zonder variabele staan, had het even snel gekopieerd en netjes gemaakt, want het is een nogal grote class.om hier te posten.
Maar bedankt voor je post, ik zal eens kijken wat ik er mee kan. |
EggsTC | vrijdag 21 november 2008 @ 00:01 |
quote:  |
Blinker | maandag 12 oktober 2009 @ 15:57 |
quote:1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 | #!/usr/bin/env python
from SocketServer import TCPServer, ThreadingMixIn, StreamRequestHandler from optparse import OptionParser
class ClientHandler(StreamRequestHandler): def handle(self): data = self.rfile.readline().strip() f = open('/proc/cpuinfo', 'r') g = open('/proc/version', 'r')
self.wfile.write('<h1>Welkom op mijn Python Webserver</h1><p>') self.wfile.write('<b>Hier wordt de cpuinfo afgebeeld:</b></p>') self.wfile.write(f.read()) self.wfile.write('<b><p>Dit is de versie :</p></b>') self.wfile.write(g.read())
class myServer( ThreadingMixIn, TCPServer ): allow_reuse_address = True
if __name__ == "__main__":
parser = OptionParser()
parser.add_option("-p", "--port", default = 1335, type="int", dest="port")
(options, args) = parser.parse_args()
server = myServer( ('',options.port), ClientHandler ) server.serve_forever() |
Ik heb deze code, maar als output krijg ik een laptekst aan elkaar. Hoe kan ik het zo filteren, zodat ik dezelfde output krijg als ik bijvoorbeeld in de shell dit invul: cat /proc/cpuinfo ipv aan één stuk.  |
Iblis | maandag 12 oktober 2009 @ 16:07 |
Wat bedoel je met ‘één stuk’? Geen regeleindes? Dat komt omdat je het denk ik met een browser bekijkt. In HTML bestaan regeleindes niet natuurlijk. Althans, die worden niet zo weergegeven. Een oplossing is om een <pre> ... </pre> mee te zenden, voor en na f.read() en anders zul je <br/> moeten invoegen.
Een snelle maar weinig schone oplossing is:
self.wfile.write(f.read())
Vervangen door:
self.wfile.write('<br/>'.join(f.readlines())) |
Blinker | maandag 12 oktober 2009 @ 16:15 |
Uitstekend! <pre></pre> did the job!
Duizend maal dank  |
Iblis | maandag 12 oktober 2009 @ 16:21 |
Voor de goede orde: je probleem is dus eigenlijk dat in HTML regeleindes meestal geen speciale betekenis hebben. Het is whitespace, maar ook niet meer dan dat. Een alinea geef je aan m.b.v. <p>…</p> en andere regeleindes met <br/>. Het is niet Python die hier de regeleindes ‘verknoeit’ dus, maar je browser. |
Blinker | maandag 12 oktober 2009 @ 16:31 |
Juist ja. Ik heb 'm door. Klinkt ook best logisch, alleen een oplossing kon ik even niet zo snel verzinnen. Maar dit werkt goed. : Nog een ding, ik beschik nu over een webpagina waar alle informatie staat. Nu zou ik graag het onderbrengen onder twee sub-pagina's en doorlinken.quote: 1 2 3 4 | hoofdpagina / \ cpuinfo freemem |
Hoe kan ik dat het beste aanpakken?
bvd  |
Iblis | maandag 12 oktober 2009 @ 16:33 |
Goede vraag, dat weet ik zo niet, je moet dan even kijken of je in die handle method bij de oorspronkelijke request kunt komen. Op basis van de request kun je dan iets anders teruggeven. |
thabit | maandag 12 oktober 2009 @ 17:00 |
Een pythontopic, ik wist niet dat dat bestond. .
Goed, bij deze zojuist gedane ontdekking heb ik meteen een (ongetwijfeld kinderlijk eenvoudige) vraag. Ik probeer nu met de module multiprocessing via Process een childproces aan te maken. Hoe kan ik exceptions die door het childprocess geraised worden opvangen in het parentprocess? Kan dat met multiprocessing.Process of is het beter iets anders te gebruiken? |
Iblis | maandag 12 oktober 2009 @ 17:09 |
quote: Op maandag 12 oktober 2009 17:00 schreef thabit het volgende:Een pythontopic, ik wist niet dat dat bestond.  . Goed, bij deze zojuist gedane ontdekking heb ik meteen een (ongetwijfeld kinderlijk eenvoudige) vraag. Ik probeer nu met de module multiprocessing via Process een childproces aan te maken. Hoe kan ik exceptions die door het childprocess geraised worden opvangen in het parentprocess? Kan dat met multiprocessing.Process of is het beter iets anders te gebruiken? Volgens mij niet. Als ik het zo bekijk zul je een Queue of een Pipe moeten gebruiken.
Dus je vangt een exceptie af, en propt die in een queue die dan uitgelezen wordt door de parent.
De processen delen niet expliciet geheugenruimte (dat zou namelijk allerhande race-condities in de hand werken) en kunnen dus ook niet zo elkaars exceptions afvangen, aangezien dat in feite objecten zijn die door een proces gegenereerd worden.
Wel kun je ze dus in een queue stoppen en eventueel in de parent re-raisen. |
thabit | maandag 12 oktober 2009 @ 17:20 |
Okee, dus gewoon een try-blok neerzetten en de exceptie in de Pipe/Queue gooien. Ik zal het eens proberen! |
Iblis | maandag 12 oktober 2009 @ 17:29 |
quote: Op maandag 12 oktober 2009 17:20 schreef thabit het volgende:Okee, dus gewoon een try-blok neerzetten en de exceptie in de Pipe/Queue gooien. Ik zal het eens proberen! Ik denk trouwens dat het beter is om te proberen in de child de boel te fiksen, als er wat aan te fiksen valt, en het alleen als dat niet kan door te gooien.
Want allerlei inspection e.d. die je normaal kunt doen kan niet meer in de parent, omdat je niet bij de variabelen/gegevens van je child kunt.
Ik weet niet of het de netste manier is om Exceptions, die van nature tamelijk proces-specifiek zijn, in een Queue te proppen. Want hoe wilde je de traceback in de parent doen b.v.? |
thabit | maandag 12 oktober 2009 @ 17:39 |
Natuurlijk is het de bedoeling om alles zoveel mogelijk te fiksen en idealiter zijn er geen exceptions. Maar er kunnen natuurlijk altijd fouten optreden en ik wil niet dat de parent deadlockt op het moment dat de child in de soep draait. Dus vraag ik me af wat de handigste manier is om dit op te lossen. |
FastFox91 | maandag 12 oktober 2009 @ 17:40 |
Wat toevallig, een vrij late bump van dit topic (in mijn AT), maar ik ben sinds paar dagen écht begonnen met Python. Ben nu vooral aan het richten op Django, maar aantal scriptjes inclusief venstertjes is al gelukt. |
DennisMoore | dinsdag 13 oktober 2009 @ 08:01 |
Doen jullie wel 's wat met Google App Engine? En dat evt in combi met Django? |
FastFox91 | zondag 18 oktober 2009 @ 12:16 |
Ook hier even mijn vraag stellen.:quote:Beste, Vooraf, PY staat voor Python en DJ voor het webframework Django. Ik ben hier nog niet zo lang mee bezig en ik vind het best leuk.  Stel je hebt een inlogpagina. Op het moment dat je al ingelogd bent en je bezoekt die pagina dan krijg je een melding dat je al ingelogd bent. Of als je wilt uitloggen, terwijl je niet uitgelogd bent krijg je daar ook een melding van. Qua opbouw hetzelfde dus ik wil hier geen twee templates voor gebruiken. DRY dus. (Vroeger in php gebruikte ik hier een MessageException voor.) Dus ik denk ik los dit zo op. return render_to_response('message.html', {"title": "Login", "content": "U bent succesvol ingelogd."}) Dit werkt goed, totdat ik iets wilde doen als <a href="link">Klik hier om door te gaan</a>. Dit loste ik op door in message.html "{{ content|safe }}" te doen ipv zonder |safe. Maar als ik nou {% url iuser.views.login %} als link wil doen, dan wordt dat letterlijk genomen en niet omgezet tot een link. Logisch, want het is een template tag en geen view tag ofzo. Hiervoor is dan de oplossing urlresolvers.reverse. Alleen dit krijg ik niet aan de praat. Help! Daarnaast vind ik het nog niet goed dat ik nou html gebruik in een view. Is dit not done, of in dit geval wel verantwoord toegepast? Zijn er (betere) alternatieven om zo'n standaard bericht terug te sturen? Nou heb ik ook nog een tweede vraag. Ik heb het volgende scriptje gevonden: klik. Dit lijkt mij wel handig, maar ik heb geen idee waar ik dit moet plaatsen. Daarnaast weer mijn vraag, is dit 'verantwoord'? (Niet tegen een bepaalde principe (van Python/Django) in ofzo) Alvast bedankt,  Michiel |
Iblis | zondag 18 oktober 2009 @ 12:52 |
Ik heb helaas helemaal geen verstand van CMS – maar heeft Django niet en heel levendige community? Dat is wel vaak het geval bij zulke projecten. Het ‘nadeel’ is wel dat je je vraag in het Engels zult moeten stellen. |
FastFox91 | zondag 18 oktober 2009 @ 13:04 |
Oh vast wel. Ik probeer het eerst even hier, proberen kan geen kwaad. Ik zal over een paar dagen wel opzoek gaan naar zo'n community. Bedankt iig.  |
thabit | donderdag 22 oktober 2009 @ 19:09 |
GUI-gerelateerde zaken, daar heb ik nul komma nul verstand van.
Ik zal in elk geval een stukje code hier posten dat mijn eerdere vraag behandelt. Ongetwijfeld kan er vanalles aan bijgeschaafd worden. Het werkt erg goed. Met dank ook aan Iblis voor een aantal tips.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 | class ChildProcessError(RuntimeError): """ A parent process may raise this if a child process produces an error. """ pass
def execute_in_child_process(f, traceback_file="traceback"): """ Decorator that makes a function execute in a child process. INPUT: - ``f`` - function - ``traceback_file`` - string (default: "traceback") OUTPUT: - function - create a child process, call f from there and return f's result REMARKS: - The side effects of f (such as caching) are thrown away. So make sure that all important information is in the output of f. In fact, reducing memory leaks is the intended use of the decorator. - If f raises an exception, the traceback is stored in traceback_file and a ChildProcessError is raised by the new function. EXAMPLES: TODO """ def new_f(*args, **kwargs): def child_process(conn): try: result = f(*args, **kwargs) except BaseException: message = "the traceback is in the file '%s'" % traceback_file conn.send(ChildProcessError(message)) conn.close() with open(traceback_file, 'a') as tr_file: traceback.print_exc(file=tr_file) return conn.send(result) conn.close() parent_conn, child_conn = Pipe() p = Process(target=child_process, args=(child_conn,)) p.start() result = parent_conn.recv() p.join() if isinstance(result, ChildProcessError): raise result return result return new_f |
[ Bericht 0% gewijzigd door thabit op 22-10-2009 19:21:00 ] |
DennisMoore | dinsdag 15 december 2009 @ 19:22 |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 | aantalsoorten = 4
for aantalpersoort in range(1,20): if aantalpersoort == 1: prijsperstuk = 1.85 elif 1 < aantalpersoort < 6: prijsperstuk = 1.70 else: prijsperstuk = 1.55 aantal = aantalsoorten * aantalpersoort if 2 < aantal < 6: verzendkosten = 1.76 elif 6 <= aantal < 11: verzendkosten = 3.60 else: verzendkosten = 6.75 totaalkosten = verzendkosten + aantal*prijsperstuk totaalperstuk = totaalkosten / float(aantal) print (int(totaalperstuk*100)-160) * "X", aantalpersoort, "->", "%.2f" % totaalperstuk |
Whehehe. Mijn eerste IRL toepassing om te schatten wat een optimale bestelhoeveelheid beefjerky is .
Output: XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX 1 -> 2.29 XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX 2 -> 2.15 XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX 3 -> 2.26 XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX 4 -> 2.12 XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX 5 -> 2.04 XXXXXXXXXXXXXXXXXXXXXXX 6 -> 1.83 XXXXXXXXXXXXXXXXXXX 7 -> 1.79 XXXXXXXXXXXXXXXX 8 -> 1.76 XXXXXXXXXXXXX 9 -> 1.74 XXXXXXXXXXX 10 -> 1.72 XXXXXXXXXX 11 -> 1.70 XXXXXXXXX 12 -> 1.69 XXXXXXX 13 -> 1.68 XXXXXXX 14 -> 1.67 XXXXXX 15 -> 1.66 XXXXX 16 -> 1.66 XXXX 17 -> 1.65 XXXX 18 -> 1.64 XXX 19 -> 1.64 |
Ofyles2 | woensdag 5 mei 2010 @ 15:42 |
* Ofyles2 schopt dit topic omhoog.
Eerstens: ik ben sinds kort verslaafd geworden aan Python (dit in combinatie met Qt4) Tweedens: dit topic raakt ondergesneeuwd door de andere talen. |
thabit | woensdag 26 mei 2010 @ 08:42 |
Kennen jullie trouwens Cython? Dat is echt geweldig. 't Is een soort mix van C en Python, the best of both worlds als het ware, de snelheid van C en de syntax van Python. Het is een gecompileerde variant op Python, waarin je de mogelijkheid hebt om statische typedeclaraties te doen, C types te gebruiken en als je wilt zelf ook je deallocatieprocedures te schrijven, etc. De meeste pure Python code compileert het overigens ook gewoon. |
keesjeislief | woensdag 26 mei 2010 @ 15:40 |
quote:Op woensdag 26 mei 2010 08:42 schreef thabit het volgende:Kennen jullie trouwens Cython? Dat is echt geweldig. 't Is een soort mix van C en Python, the best of both worlds als het ware, de snelheid van C en de syntax van Python. Het is een gecompileerde variant op Python, waarin je de mogelijkheid hebt om statische typedeclaraties te doen, C types te gebruiken en als je wilt zelf ook je deallocatieprocedures te schrijven, etc. De meeste pure Python code compileert het overigens ook gewoon. Ik gebruik het nogal eens om stukken code in het open source CAS SAGE te 'compileren', ik vind het ook fantastisch om de voordelen van 'high-level' Python gecombineerd te zien met uitvoeringssnelheden in dezelfde orde als C!  |
Wolfje | woensdag 26 mei 2010 @ 22:08 |
quote:Op woensdag 26 mei 2010 08:42 schreef thabit het volgende:Kennen jullie trouwens Cython? Dat is echt geweldig. 't Is een soort mix van C en Python, the best of both worlds als het ware, de snelheid van C en de syntax van Python. Het is een gecompileerde variant op Python, waarin je de mogelijkheid hebt om statische typedeclaraties te doen, C types te gebruiken en als je wilt zelf ook je deallocatieprocedures te schrijven, etc. De meeste pure Python code compileert het overigens ook gewoon. Een taal die ook het gemak van python probeert te combineren met de snelheid van c is go. Het is een vrij nieuwe taal, maar het heeft wel potentie om groot te worden aangezien google er achter zit. |
thabit | donderdag 27 mei 2010 @ 10:43 |
Dat go heeft zo te zien wel accolades. Dus ik denk dat ik het maar bij Python en C(++) houd. |
Iblis | donderdag 27 mei 2010 @ 20:35 |
Ik vind Go meer op Limbo lijken. Ik vind het in vergelijking met Python (te) kaal qua taalfeatures zoals een soort van polymorfisme of overerving. |
Outlined | zaterdag 7 augustus 2010 @ 01:28 |
Haskell, dat is pas leuk  |
Farenji | zaterdag 7 augustus 2010 @ 11:09 |
Heb laatst wat geklooid met Django, en ik moet zeggen, dat is toch best cool. Mooi clean framework waar je binnen no time een webapplicatie mee hebt opgezet. |
keesjeislief | zaterdag 7 augustus 2010 @ 12:12 |
De laatste tijd doe ik alle programmeerdingetjes voor mijn werk in SAGE (een open source computer algebra system in Python), ik raak mijn versie van Mathematica nauwelijks meer aan. . Het is ontzettend fijn om een volledige programmeertaal tot je beschikking te hebben (zoals de OO-capaciteiten) met zo'n fijne syntax, in combinatie met het feit dat het open source zijn betekent dat je zo diep in SAGE kunt graven als je zelf wilt/nodig hebt. (Vooral als je voor snelheid wilt optimaliseren is dat ideaal.)
Eigenlijk vind ik dat je als wetenschapper sowieso principieel zoveel mogelijk gesloten systemen zoals Mathematica moet vermijden. |
thabit | zaterdag 7 augustus 2010 @ 17:49 |
Sage gebruik ik tegenwoordig ook heel veel. Er zit nog wel een shitload aan bugs in, maar het voordeel van open source is dat je die zelf kunt fixen en zo je steentje aan het systeem kunt bijdragen. . |
jakkop | zondag 28 november 2010 @ 23:46 |
Klein schopje. Ben wat aan het rondklooien met curses. Hoe kan ik
automatisch iedere x seconden z'n werk laten doen? |
thabit | maandag 29 november 2010 @ 00:02 |
Misschien met een Thread die telkens x seconden slaapt en daarna de zaak refresht? |
Chandler | zaterdag 19 april 2014 @ 01:46 |
Algemeen vraagje; ik ben bezig Python om video's en foto's te kunnen schieten met de raspberry pi en de pi camera. Echter ben ik opzoek naar een nette / snelle methode om te kijken of 2 afbeeldingen op elkaar lijken. Nu heb ik al verschillende snippets gevonden maar veel wijzer wordt ik daar niet van. 
Weet iemand een snelle simpele manier om via python (zonder een system call) 2 afbeeldingen te vergelijken (eventueel te verkleinen, zwart-wit te maken)?
Thanks!  |
#ANONIEM | zondag 20 april 2014 @ 16:20 |
quote: Op zaterdag 19 april 2014 01:46 schreef Chandler het volgende:Algemeen vraagje; ik ben bezig Python om video's en foto's te kunnen schieten met de raspberry pi en de pi camera. Echter ben ik opzoek naar een nette / snelle methode om te kijken of 2 afbeeldingen op elkaar lijken. Nu heb ik al verschillende snippets gevonden maar veel wijzer wordt ik daar niet van.  Weet iemand een snelle simpele manier om via python (zonder een system call) 2 afbeeldingen te vergelijken (eventueel te verkleinen, zwart-wit te maken)? Thanks!  Heb je hier misschien wat aan? https://wiki.python.org/moin/ImageMagick |
Chandler | zondag 20 april 2014 @ 23:32 |
quote: Op zich wel, heb er nu al een tijdje door de docs heen zitten scrollen maar zie niet echt een mogelijkheid om 'compare' zonder commandline te doen, het vergelijken van 2 beelden. Heb je een voorbeeld gezien? |
Chandler | maandag 21 april 2014 @ 17:19 |
Even een andere vraag, waarom kom ik nooit uit op finally? ik dacht dat een else met break werkte niet.. hoe kan ik zorgen dat ik bij een false op motion detect de finally bereik? 
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | try: motionFilename = directory + '/' + datetime.datetime.now().strftime('%Y-%m-%d-%H-%M-%s') + '.h264' while True: camera.wait_recording(1) # if motion is detected, record for xx time and the video every xx seconds if detect_motion(): # Once we've detected motion, keep recording for xx seconds # and only then dump the stream to disk camera.wait_recording(motionVideoTime) write_video(stream, motionFilename) # else: # break; finally: # no motion detected anymore? stop recording camera.stop_recording() # remove first frame, so we need to run multiple runs for new 'screens' prior_image = None |
|
#ANONIEM | dinsdag 22 april 2014 @ 18:30 |
quote: Op maandag 21 april 2014 17:19 schreef Chandler het volgende:Even een andere vraag, waarom kom ik nooit uit op finally? ik dacht dat een else met break werkte niet.. hoe kan ik zorgen dat ik bij een false op motion detect de finally bereik?  [ code verwijderd ] Wat is het nut van een try zonder catch? |
Chandler | dinsdag 22 april 2014 @ 18:55 |
Euh... geen idee, zo uit een snippet gehaald en aangepast zodat het werkte zoals ik het wenste 
Heb je een betere opzet? 
In 2 weken python geleerd en dit is met kopieren en plakken en een hoop aanpassen m'n huidige scriptje
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 | #python example import io import time import math # for microtime import datetime # for date import os # for system calls import datetime from PIL import Image import ImageChops import operator import picamera
# functions
def avg(values): if type(values) == type(1): return values return sum(values)//len(values)
def hamming_distance(a_list, b_list): return sum(item1 != item2 for item1, item2 in zip(a_list, b_list))
def num_pairs(num_items): num_pairs = 0 while num_items > 0: num_items -= 1 num_pairs += num_items return num_pairs
def compare(image1, image2): image1 = image1.resize((8, 8), Image.BILINEAR) grayscale_pixels = map(avg, list(image1.getdata())) # del image1 pixel_avg = avg(grayscale_pixels) first = [(pixel > pixel_avg) for pixel in grayscale_pixels]
image2 = image2.resize((8, 8), Image.BILINEAR) grayscale_pixels = map(avg, list(image2.getdata())) # del image2 pixel_avg = avg(grayscale_pixels) second = [(pixel > pixel_avg) for pixel in grayscale_pixels]
return ((64 - hamming_distance(first, second)) * 100) // 64 def getFreeSpace(): # read free space from current path. st = os.statvfs(os.getcwd()) du = st.f_bavail * st.f_frsize return du def bytes2human(n): symbols = ('K', 'M', 'G', 'T', 'P', 'E', 'Z', 'Y') prefix = {} for i, s in enumerate(symbols): prefix[s] = 1 << (i + 1) * 10 for s in reversed(symbols): if n >= prefix[s]: value = float(n) / prefix[s] return '%.1f%s' % (value, s)
return "%sB" % n
def detect_motion(): global camera, prior_image, current_image global motionShotWidth, motionShotHeight
stream = io.BytesIO() # camera.capture(stream, format = 'jpeg', use_video_port = True) camera.capture(stream, format = 'jpeg', use_video_port = True, resize = (motionShotWidth, motionShotHeight)) stream.seek(0) if prior_image is None: # print ("{} - First motion saved".format(datetime.datetime.now().strftime('%Y/%m/%d %H:%M:%S'))) prior_image = Image.open(stream) prior_image.save('first.jpg', 'jpeg', quality=80, optimize=True, progressive=True) return 0 # false else: # print ("{} - Second motion saved".format(datetime.datetime.now().strftime('%Y/%m/%d %H:%M:%S'))) current_image = Image.open(stream) current_image.save('second.jpg', 'jpeg', quality=80, optimize=True, progressive=True)
# we want this in percent of difference, all below 90 is for continue recording, all higher could end. procent = compare(prior_image, current_image) if procent < 80: print ("{} - Motion detected!!! {}%".format(datetime.datetime.now().strftime('%Y/%m/%d %H:%M:%S'), procent)) return True # image_found = 1 else: print ("{} - NO motion detected {}%".format(datetime.datetime.now().strftime('%Y/%m/%d %H:%M:%S'), procent)) # image_found = 0 prior_image = current_image return False # return image_found
def write_video(stream, filename): # Write the entire content of the circular buffer to disk with io.open(filename, 'wb') as output: with stream.lock: for frame in stream.frames: if frame.header: stream.seek(frame.position) break while True: buf = stream.read1() if not buf: break output.write(buf)
def takeTimeleapseShot(): global camera, timeLeapseWidth, timeLeapseHeight, timeLeapseDirectory global prior_image # create variable for timeLeapseshot if not os.path.exists(timeLeapseDirectory): os.makedirs(timeLeapseDirectory) directory = timeLeapseDirectory + '/' + datetime.datetime.now().strftime('%Y-%m-%d') if not os.path.exists(directory): os.makedirs(directory) tlshot = directory + '/' + datetime.datetime.now().strftime('%Y-%m-%d-%H-%M-%s') + '.jpg' # set resolution and take the shot! camera.resolution = (timeLeapseWidth, timeLeapseHeight) camera.capture(tlshot, 'jpeg')
return
def takeMovementShot(): global camera global motionVideoWidth, motionVideoHeight, motionVideoTime, motionDirectory
if not os.path.exists(motionDirectory): os.makedirs(motionDirectory) # is motion detected? if detect_motion(): # display that motion is detected # print("{} -++ Motion detected".format(datetime.datetime.now().strftime('%Y/%m/%d %H:%M:%S'))) # set camera resolution for the motion video camera.resolution = (motionVideoWidth, motionVideoHeight) # open stream for the recording stream = picamera.PiCameraCircularIO(camera, seconds=5) # start recording the stream in format h264 camera.start_recording(stream, format = 'h264') try: directory = motionDirectory + '/' + datetime.datetime.now().strftime('%Y-%m-%d') if not os.path.exists(directory): os.makedirs(directory) motionFilename = directory + '/' + datetime.datetime.now().strftime('%Y-%m-%d-%H-%M-%s') + '.h264' while (True): camera.wait_recording(1) # if motion is detected, record for xx time and the video every xx seconds if detect_motion() == True: # Once we've detected motion, keep recording for xx seconds # and only then dump the stream to disk print("{} -++ Recording for {} seconds".format(datetime.datetime.now().strftime('%Y/%m/%d %H:%M:%S'), motionVideoTime)) camera.wait_recording(motionVideoTime) write_video(stream, motionFilename) else: break; finally: # no motion detected anymore? stop recording print("{} - End recording, no more motion detected".format(datetime.datetime.now().strftime('%Y/%m/%d %H:%M:%S'))) camera.stop_recording() # remove first frame, so we need to run multiple runs for new 'screens' prior_image = None print("{} -++ Exit function".format(datetime.datetime.now().strftime('%Y/%m/%d %H:%M:%S'))) # variables timeLeapseWidth = 1920 timeLeapseHeight = 1080 timeLeapseDirectory = 'timeleapseshot' motionShotWidth = 102 motionShotHeight = 77 motionVideoWidth = 1024 motionVideoHeight = 768 motionVideoTime = 5 motionDirectory = 'motion' # for image comparisson prior_image = None # for comparing images imageChops maximum_rms = 15 # for comparing images commandline imageDifference = 75; # start the picamera camera = picamera.PiCamera() # disable camera led camera.led = False # Keep 500 mb free on disk diskSpaceToReserve = 500 * 1024 * 1024
# seconds timerLoop = time.time() + (3600 * 24) # microseconds (100000 is one second) timerDelay = 0.005 # init loopCounter loopCounter = 0 currentTimer = 0
# array for timeleapse shot timerArray = {} timerArray[0] = {} timerArray[0]['each'] = 5 timerArray[0]['last'] = time.time() timerArray[0]['time'] = 0 timerArray[0]['timemin'] = 0 timerArray[0]['timemax'] = 0 timerArray[0]['counter'] = 0 timerArray[0]['execute'] = 'takeTimeleapseShot' timerArray[0]['title'] = 'Take timeleapse shot'
timerArray[1] = {} timerArray[1]['each'] = 0.25 timerArray[1]['last'] = time.time() timerArray[1]['time'] = 0 timerArray[1]['timemin'] = 0 timerArray[1]['timemax'] = 0 timerArray[1]['counter'] = 0 timerArray[1]['execute'] = 'takeMovementShot' timerArray[1]['title'] = 'Take motion shot'
# main script while True: timeLeft = timerLoop - time.time() loopCounter = loopCounter + 1 for (key, s) in timerArray.items(): if s['each'] > 0: if (s['last'] == 0) or (time.time() - s['last'] > s['each']): print ("{} - Function {} starting".format(datetime.datetime.now().strftime('%Y/%m/%d %H:%M:%S'), s['execute']))
c = s['counter'] + 1 currentTimer = time.time() # start function locals()[s['execute']]() endTimer = time.time() - currentTimer
print ("{} - {} secs left - {} - {} (# {})".format(datetime.datetime.now().strftime('%Y/%m/%d %H:%M:%S'), math.trunc(timeLeft), loopCounter, s['title'], c))
# save information about last function timerArray[key]['last'] = time.time() timerArray[key]['counter'] += 1 timerArray[key]['time'] = timerArray[key]['time'] + endTimer
# save min/max time for benchmarking if (timerArray[key]['timemin'] == 0) or (timerArray[key]['timemin'] != 0 and timerArray[key]['timemin'] > endTimer): timerArray[key]['timemin'] = endTimer if (timerArray[key]['timemax'] == 0) or (timerArray[key]['timemax'] != 0 and timerArray[key]['timemax'] < endTimer): timerArray[key]['timemax'] = endTimer # sleep for timerDelay seconds (or microseconds) time.sleep(timerDelay) # break when time has reached its end. if time.time() > timerLoop: print(timerArray) break # break when free space is lower then given value if getFreeSpace() < diskSpaceToReserve: print("{} - Exiting: No more free space {} free".format(datetime.datetime.now().strftime('%Y/%m/%d %H:%M:%S'), bytes2human(getFreeSpace()))) # close camera camera.close() |
Graag hoor ik opbouwende comments! 
[ Bericht 97% gewijzigd door Chandler op 22-04-2014 19:06:31 ] |
#ANONIEM | dinsdag 22 april 2014 @ 20:39 |
quote: Op dinsdag 22 april 2014 18:55 schreef Chandler het volgende:Euh... geen idee, zo uit een snippet gehaald en aangepast zodat het werkte zoals ik het wenste  Heb je een betere opzet?  In 2 weken python geleerd en dit is met kopieren en plakken en een hoop aanpassen m'n huidige scriptje [ code verwijderd ] Graag hoor ik opbouwende comments!  Oké. Hmm. Ik ben gewend om objectgeoriënteerd te programmeren, dus het is even wennen voor mij om een lijst met functies te lezen.
De average-functie die je hebt gemaakt heeft Python zelf ook. https://docs.python.org/3/library/statistics.html#statistics.mean
Wel goed dat je de taal zo leert. https://docs.python.org/3/library/statistics.html#statistics.mean
Met het alleen kopiëren en plakken van dingen moet je oppassen dat je de achterliggende gedachten wel begrijpt. Een try en catch gebruik je als je er van uitgaat dat er iets fout kan gaan.
Als de code binnen de try fout gaat, dan komt je programma in de catch. Finally wordt ook uitgevoerd als er problemen zijn binnen de try.
Voorbeeldje:
1 2 3 4 5 6 7 8 | Try: #Hier gebeuren allerlei dingen blablablabla # Eventueel zouden ze mis kunnen gaan Catch: #Hier gaat de code naartoe als er iets fout gaat. #In dit blok kun je bijvoorbeeld een foutmelding laten verschijnen als het mis gaat. Finally: #Altijd als de try wordt verlaten zal dit blok uitgevoerd worden, dus zowel wanneer er een exception palatsvindt als wanneer het goed gaat. |
Alleen werkt het in Python net wat anders dan Catch. In Python heet dat Except volgens mij. Een goed voorbeeld staat hier:
https://docs.python.org/2/tutorial/errors.html
[ Bericht 3% gewijzigd door #ANONIEM op 22-04-2014 20:55:16 ] |
thabit | dinsdag 22 april 2014 @ 20:55 |
Commentaar binnen de functiebody's mag wel iets minder. Voorbeeld:
1 2 | # start recording the stream in format h264 camera.start_recording(stream, format = 'h264') |
Het stuk code is leesbaar genoeg hier en sowieso vrijwel hetzelfde als het commentaar dat erboven staat.
Wat je bijvoorbeeld wel kan doen, is elke functie van een docstring voorzien. Ben je daarmee bekend? |
thabit | dinsdag 22 april 2014 @ 20:59 |
1 2 3 4 5 6 | def num_pairs(num_items): num_pairs = 0 while num_items > 0: num_items -= 1 num_pairs += num_items return num_pairs |
Kan eenvoudiger:
1 2 | def num_pairs(num_items): return num_items * (num_items - 1) / 2 |
Of met docstring:
1 2 3 | def num_pairs(num_items): """Return the number of pairs that can be drawn from a list of num_items items.""" return num_items * (num_items - 1) / 2 |
|
Chandler | dinsdag 22 april 2014 @ 21:11 |
Thanks allebeide! 
Ik heb idd nog een hoop te leren, en dit is mijn manier van leren maar aangezien ik PHP aardig onder de knie heb en dit er goed op lijkt gaat het me best aardig af! 
Zal weer verder gaan spelen met de code, stukje voor stukje wordt het beter
Oh, kunnen jullie me het volgende mogelijk vertellen/verwijzen;
- die beginnende array beginnend op regel 207, kan dat ook mooier?  - volgens mij is die try daar helemaal niet nodig, want een while voor het detecteren van de 'motion' lijkt me genoeg. - Mijn functie van het detecteren van beweging is alles behalve 'erg goed' in goed licht werkt het vrij goed, maar wordt het ietsje donkerder dan blijft hij zelfs 'donker' opnemen.... vreemd. - Oh en die While(True), waar haalt hij zijn true vandaan? uit de if statement?
[ Bericht 3% gewijzigd door Chandler op 22-04-2014 21:34:49 ] |
#ANONIEM | dinsdag 22 april 2014 @ 21:39 |
quote: Op dinsdag 22 april 2014 21:11 schreef Chandler het volgende:Thanks allebeide!  Ik heb idd nog een hoop te leren, en dit is mijn manier van leren  maar aangezien ik PHP aardig onder de knie heb en dit er goed op lijkt gaat het me best aardig af!  Zal weer verder gaan spelen met de code, stukje voor stukje wordt het beter Oh, kunnen jullie me het volgende mogelijk vertellen/verwijzen; - die beginnende array beginnend op regel 207, kan dat ook mooier?  - volgens mij is die try daar helemaal niet nodig, want een while voor het detecteren van de 'motion' lijkt me genoeg. - Mijn functie van het detecteren van beweging is alles behalve 'erg goed'  in goed licht werkt het vrij goed, maar wordt het ietsje donkerder dan blijft hij zelfs 'donker' opnemen.... vreemd. - Oh en die While(True), waar haalt hij zijn true vandaan? uit de if statement? While(true) is een oneindige loop die pas stopt als het programma stopt als ik mij niet vergis. 
[ Bericht 0% gewijzigd door #ANONIEM op 22-04-2014 21:39:59 ] |
Chandler | dinsdag 22 april 2014 @ 21:39 |
quote: Tenzij er een break komt dan, want die zit er ook in  |
#ANONIEM | dinsdag 22 april 2014 @ 21:40 |
quote: Precies! Wat ook zou kunnen is een boolean daarvoor aanmaken. Vind ik persoonlijk wel netter.
1 2 3 4 5 | shouldLoop = True # maar dan een betere naam!
while(shouldLoop): if blablablaconditie: shouldLoop = False |
[ Bericht 32% gewijzigd door #ANONIEM op 22-04-2014 21:42:33 ] |
thabit | dinsdag 22 april 2014 @ 22:04 |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 | # array for timeleapse shot timerArray = {} timerArray[0] = {} timerArray[0]['each'] = 5 timerArray[0]['last'] = time.time() timerArray[0]['time'] = 0 timerArray[0]['timemin'] = 0 timerArray[0]['timemax'] = 0 timerArray[0]['counter'] = 0 timerArray[0]['execute'] = 'takeTimeleapseShot' timerArray[0]['title'] = 'Take timeleapse shot'
timerArray[1] = {} timerArray[1]['each'] = 0.25 timerArray[1]['last'] = time.time() timerArray[1]['time'] = 0 timerArray[1]['timemin'] = 0 timerArray[1]['timemax'] = 0 timerArray[1]['counter'] = 0 timerArray[1]['execute'] = 'takeMovementShot' timerArray[1]['title'] = 'Take motion shot' |
Je maakt hier een dictionary van dictionaries van timerArray. Waarom niet gewoon een list? Snake case is trouwens gebruikelijker in Python dan camel case (dus timer_array).
1 2 | timer_array = [{'each': 5, 'last': time.time(), 'time': 0, etc}, {'each': 0.25, 'last': time.time(), 'time': 0, etc}] |
|
thabit | dinsdag 22 april 2014 @ 22:12 |
1 | for (key, s) in timerArray.items(): |
Je gebruikt de waarde van de key hier alleen om de timerArray te indexeren. Het kan ook zo:
|
thabit | dinsdag 22 april 2014 @ 22:20 |
1 | locals()[s['execute']]() |
Dit is ook wat cryptisch. Je kunt functies gewoon gebruiken als dict values (gewoon geen aanhalingstekens gebruiken: takeTimeleapseShot ipv 'takeTimeleapseShot'). Dan kun je het eenvoudig zo doen:
|
Chandler | woensdag 23 april 2014 @ 07:28 |
Top! ik ga er verder mee spelen en kom hier later allemaal op terug 
Thanks!
Oh en deze regel
Ik kan ik dan ook de data aanpassen? daarvoor gebruik ik nu de key, om de juiste data aan te passen in deze array...
-edit 1-
s['execute']() werkt niet, krijg een foutmelding, als ik het weer verander naar locals()[s['execute']]() werkt het wel 
Tevens als ik de dictionary verander, moet ik ook de for veranderen, dus dat moet even wachten...
[ Bericht 30% gewijzigd door Chandler op 23-04-2014 07:42:35 ] |
thabit | woensdag 23 april 2014 @ 07:55 |
1 2 3 | timerArray[0]['execute'] = 'takeTimeleapseShot' ... timerArray[1]['execute'] = 'takeMovementShot' |
Dat moet je veranderen in:
1 2 3 | timerArray[0]['execute'] = takeTimeleapseShot ... timerArray[1]['execute'] = takeMovementShot |
|
thabit | woensdag 23 april 2014 @ 08:05 |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | def compare(image1, image2): image1 = image1.resize((8, 8), Image.BILINEAR) grayscale_pixels = map(avg, list(image1.getdata())) # del image1 pixel_avg = avg(grayscale_pixels) first = [(pixel > pixel_avg) for pixel in grayscale_pixels]
image2 = image2.resize((8, 8), Image.BILINEAR) grayscale_pixels = map(avg, list(image2.getdata())) # del image2 pixel_avg = avg(grayscale_pixels) second = [(pixel > pixel_avg) for pixel in grayscale_pixels]
return ((64 - hamming_distance(first, second)) * 100) // 64 |
Dit ziet er vrij ingewikkeld uit. Kun je misschien het volgende proberen:
1 2 3 4 5 6 7 8 | def compare(image1, image2): image1 = image1.resize((8, 8), Image.BILINEAR) grayscale_pixels1 = map(avg, list(image1.getdata()))
image2 = image2.resize((8, 8), Image.BILINEAR) grayscale_pixels2 = map(avg, list(image2.getdata()))
return sum((grayscale_pixels1[i]-grayscale_pixels2[i])**2 for i in len(grayscale_pixels1)) |
En dan kijken of dit boven een bepaalde drempelwaarde uitkomt?
[ Bericht 0% gewijzigd door thabit op 23-04-2014 08:14:01 ] |
Chandler | woensdag 23 april 2014 @ 08:08 |
quote: Dit werkte niet met deze array
1 2 | timerArray = [{'each': 5, 'last': time.time(), 'time': 0, 'timemin': 0, 'timem...}, {'each': 0.25, 'last': time.time(), 'time': 0, 'timemin': 0, 'timem...}] |
Maar wel met mijn huidige 'array' en ik zal die andere functie vanavond eens proberen! thanks! |
slacker_nl | woensdag 23 april 2014 @ 10:10 |
Crap, ik had een stukje tekst en die is nu weg.
In het kort, ik zag het ook in je PHP code, maar je doet aan code duplicatie, bijvoorbeeld in je compare:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | def compare(a, b) ik_doe_kekke_dingen(a); a.kekkedingen_ik_doe();
ik_doe_kekke_dingen(b); b.kekkedingen_ik_doe();
return verschil_tussen(a,b);
# maar def compare(a, b); a = _meuk(a); b = _meuk(b); return verschil_tussen(a,b);
def _meuk(x): ik_doe_kekke_dingen(x); x.kekkedingen_ik_doe(); return x; |
Verder zou ik niet
1 2 3 4 5 | dir = my_custom_dir . '/' . iets(); doen
# maar
os.path.join(my_custom_dir, iets(), dit(), dat()); |
Dat fixed je shit ook op een ander platform (denk Windows portability).
En verder had ik zo'n type interface ingedachte:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | import picamera import motiondetect
camera = picamera.PiCamer(); camera.led = False; # Kijk trouwens even of dit kan: camera = picamera.PiCamer(led => False);
md = motiondetect.MotionDetect( camera => camera, path => '/path/to/storage', # meerdere opties hier );
md.run(); |
Dat is dan je script.
Voordeel is dat je motiondetect volledig kan testen in een testfile, want alle logica zit in die module/class. Een script testen is toch wat lastiger.
En mocht er een camera API zijn anders dan picamera die dezelfde interface heeft dan kan je dat plugged en playend aanpassen.
Overigens zou ik ook nog in de docs van picamera kijken, je doet een resize en de docs zeggen dit: http://picamera.readthedo(...)uring-resized-images
quote: Although such resizing can be performed using libraries like PIL or OpenCV, it is considerably more efficient to have the Pi’s GPU perform the resizing when capturing the image. This can be done with the resize parameter of the capture() methods: Verder moet je meer commentaar in je code zetten, en daarmee bedoel ik dat je je functies moet documenteren. https://docs.python.org/devguide/documenting.html https://google-styleguide(...)yguide.html#Comments (staan leuke dingen in, los van hoe te documenteren).
Tevens ben ik benieuwd naar wat er gebeurd als je een pad hebt wat niet aangemaakt kan worden, ga je dood of blijf je doorgaan? Ik zie namelijk nergens een die, throw oid.
[ Bericht 2% gewijzigd door slacker_nl op 23-04-2014 10:15:45 ] |
FastFox91 | woensdag 23 april 2014 @ 11:13 |
In een python script maak ik een (grote numpy) matrix. Die sla ik vervolgens op met pickle. Werkt prima. Vervolgens laad ik het bestand met pickle in een ander script, en dan zegt die MemoryError. Als je 'm überhaupt kan maken, dan zou je 'm toch ook kunnen laden? edit: bug in cPickle, want met pickle werkt het wel.
[ Bericht 7% gewijzigd door FastFox91 op 23-04-2014 13:24:46 ] |
thabit | woensdag 23 april 2014 @ 19:39 |
quote: Op woensdag 23 april 2014 10:10 schreef slacker_nl het volgende:Crap, ik had een stukje tekst en die is nu weg. In het kort, ik zag het ook in je PHP code, maar je doet aan code duplicatie, bijvoorbeeld in je compare: [ code verwijderd ] Verder zou ik niet [ code verwijderd ] Dat fixed je shit ook op een ander platform (denk Windows portability). En verder had ik zo'n type interface ingedachte: [ code verwijderd ] Dat is dan je script. Voordeel is dat je motiondetect volledig kan testen in een testfile, want alle logica zit in die module/class. Een script testen is toch wat lastiger. En mocht er een camera API zijn anders dan picamera die dezelfde interface heeft dan kan je dat plugged en playend aanpassen. Overigens zou ik ook nog in de docs van picamera kijken, je doet een resize en de docs zeggen dit: http://picamera.readthedo(...)uring-resized-images[..] Verder moet je meer commentaar in je code zetten, en daarmee bedoel ik dat je je functies moet documenteren. https://docs.python.org/devguide/documenting.htmlhttps://google-styleguide(...)yguide.html#Comments (staan leuke dingen in, los van hoe te documenteren). Tevens ben ik benieuwd naar wat er gebeurd als je een pad hebt wat niet aangemaakt kan worden, ga je dood of blijf je doorgaan? Ik zie namelijk nergens een die, throw oid. Krijg je geen kramp in je pink van al die puntkomma's? |
#ANONIEM | woensdag 23 april 2014 @ 19:42 |
quote: Blijft wennen. Die catch deed ik ook per ongeluk.  |
slacker_nl | woensdag 23 april 2014 @ 20:03 |
quote: Ja; |
Chandler | woensdag 23 april 2014 @ 22:22 |
Ik ga morgen avond even inhoudelijk reageren maar heb wel 1 vette bug gevonden, misschien dat jullie zo de oplossing zien; het zit hem in het opslaan van de video, in de volgende stukjes code kijk ik of er beweging is en zo ja dan wil ik deze gegevens opslaan, echter voegt hij niets toe maar overschrijft hij steeds het bestand, is het mogelijk om het steeds aan elkaar toe te voegen? of zit ik dan met 'headers' van het h264 bestand (heb daar nog niet de documentatie doorgelezen, ga ik morgen doen).
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 | motion = detect_motion() if motion is not False and motion < motionPercent: print("{} -> Movement detected".format(datetime.datetime.now().strftime('%Y/%m/%d %H:%M:%S'))) # set camera resolution for the motion video camera.resolution = (motionVideoWidth, motionVideoHeight) # open stream for the recording stream = picamera.PiCameraCircularIO(camera, seconds=5) camera.start_recording(stream, format = 'h264')
while (motion): camera.wait_recording(1)
if motion is not False and motion < motionPercent: # Once we've detected motion, keep recording for xx seconds and only then dump the stream to disk if DEBUG: print("{} -> Recording for {} seconds".format(datetime.datetime.now().strftime('%Y/%m/%d %H:%M:%S'), motionVideoTime)) camera.wait_recording(motionVideoTime) write_video(stream, motionFilename) # get new motion motion = detect_motion() + else: # set to false coz to low in percent to continue motion = False print("{} -> End recording".format(datetime.datetime.now().strftime('%Y/%m/%d %H:%M:%S'))) camera.stop_recording()
# remove motion frames, so we need to run multiple runs for new 'screens' prior_image = None current_image = None def write_video(stream, filename): """Write the entire content of the circular buffer to disk""" with io.open(filename, 'wb') as output: with stream.lock: for frame in stream.frames: if frame.header: stream.seek(frame.position) break while True: buf = stream.read1() if not buf: break output.write(buf) |
stukje code komt van : https://github.com/wavefo(...)er/docs/recipes2.rst
Thanks wederom voor alle input, iets waar ik morgen weer ff mee bezig kan  |
thabit | woensdag 23 april 2014 @ 22:48 |
|
Chandler | donderdag 24 april 2014 @ 07:46 |
quote: Op woensdag 23 april 2014 10:10 schreef slacker_nl het volgende:Crap, ik had een stukje tekst en die is nu weg. In het kort, ik zag het ook in je PHP code, maar je doet aan code duplicatie, bijvoorbeeld in je compare: Klopt, op zich niet zo erg toch zolang het er maar geen 10+x in staat, maar heb het gelijk een functie gegeven 
1 2 3 4 5 6 7 8 9 10 11 | def compareLoadImage(image): """Load image for comparing, resize and grayscale""" image1 = image.resize((8, 8), Image.BILINEAR) grayscale_pixels = map(avg, list(image1.getdata())) pixel_avg = avg(grayscale_pixels) return [(pixel > pixel_avg) for pixel in grayscale_pixels]
def compare(image1, image2): """Return the hamming distance between to loaded, resized and getting grayscaled pixel data""" return ((64 - hamming_distance(compareLoadImage(image1), compareLoadImage(image2))) * 100) // 64 |
Beter? 
quote: Verder zou ik niet ..
[ code verwijderd ]
Dat fixed je shit ook op een ander platform (denk Windows portability).
Ik gebruik idd no os.path.join, is duidelijker 
quote: En verder had ik zo'n type interface ingedachte: [ code verwijderd ] Dat is dan je script. Voordeel is dat je motiondetect volledig kan testen in een testfile, want alle logica zit in die module/class. Een script testen is toch wat lastiger. En mocht er een camera API zijn anders dan picamera die dezelfde interface heeft dan kan je dat plugged en playend aanpassen. [/qoute] Hoeft voor mij niet, denk dat ik nog wel commandline opties ga toevoegen zodat ik het scriptje kan gebruiken voor bv alleen een timeleapse of juist alleen voor video's (motion) opnemen.. [quote] Overigens zou ik ook nog in de docs van picamera kijken, je doet een resize en de docs zeggen dit: http://picamera.readthedo(...)uring-resized-images Doe ik reeds:
1 | camera.capture(stream, format = 'jpeg', use_video_port = True, resize = (motionShotWidth, motionShotHeight)) |
quote: Is idd handiger, ben er al druk doende mee 
quote: Tevens ben ik benieuwd naar wat er gebeurd als je een pad hebt wat niet aangemaakt kan worden, ga je dood of blijf je doorgaan? Ik zie namelijk nergens een die, throw oid.
Klopt, hoeft ook niet, ga er gewoon vanuit dat het werkt dit scriptje hoeft niet alles af te vangen 
quote: Ga ik proberen! maar ben bang dat h264 video's niet zo werken 
Voorbeeld: http://pastebin.com/xwaczyJL
[ Bericht 6% gewijzigd door Chandler op 24-04-2014 08:08:26 ] |
slacker_nl | vrijdag 25 april 2014 @ 15:46 |
quote: Op donderdag 24 april 2014 07:46 schreef Chandler het volgende:[..] Klopt, op zich niet zo erg toch zolang het er maar geen 10+x in staat, maar heb het gelijk een functie gegeven  [ code verwijderd ] Beter?  Veel! Ik zie het ook vaker in je PHP code, dus je hebt er een handje naar
quote: Klopt, hoeft ook niet, ga er gewoon vanuit dat het werkt  dit scriptje hoeft niet alles af te vangen  Dan kan die diskspace check er ook uit! |
Chandler | vrijdag 25 april 2014 @ 19:02 |
quote: Valt toch wel mee? 
quote: Dan kan die diskspace check er ook uit! Kan, maar vind een nette exit wel een stuk leuker en die andere extra's zijn juist bedoeld dat als ik bestanden verplaats en per ongelijk de directory ook mee neem, deze ook weer aangemaakt worden.. maar goed ben nog maar net begonnen met Python! dus heb nog een lange weg te gaan! |
#ANONIEM | vrijdag 25 april 2014 @ 20:44 |
Wel een heerlijke taal, Python.  |
Chandler | vrijdag 25 april 2014 @ 20:47 |
Op zich zekers, lekker basic zeg maar.. Alleen moet ik erg wennen aan het niet plaatsen van ; 
Vrij snel voor mijn doeleinden! sneller iig dan PHP  |
Djurres | dinsdag 29 april 2014 @ 19:49 |
Ja, ik ga ook beginnen met python! Mensen die hier bekend zijn met python icm de GPIO pinnen van een raspberry pi? |
Chandler | dinsdag 13 mei 2014 @ 12:36 |
Ik heb een script gevonden; https://gist.github.com/astanin/626356
Nu wil ik deze gebruiken voor het vergelijken van afbeeldingen maar snap echt de ballen van de uitkomst van het script, ik zou liever in % willen zien hoeveel verschil er tussen de plaatjes zit.
Ik krijg nu resultaat terug in Manhattan norm? Zero norm?
Kan iemand mij hier een duidelijke uitleg over geven? eventueel helpen met aanpassen zodat ik het resultaat procentueel terug krijg?  |
Aether | zondag 18 mei 2014 @ 15:02 |
Kwam een tijd terug Q tegen waarmee op CSV (bestanden) SQL queries uitgevoerd kunnen worden.
Voorbeelden:
find /tmp -ls | q "select c5,c6,sum(c7)/1024.0/1024 as total from - group by c5,c6 order by total desc"
q "select myfiles.c8,emails.c2 from exampledatafile myfiles join group-emails-example emails on (myfiles.c4 = emails.c1) where myfiles.c8 = 'ppp'" |
#ANONIEM | zondag 8 februari 2015 @ 08:55 |
Te weinig activiteit, terwijl Python zo baas is. |
KomtTijd... | zondag 8 februari 2015 @ 10:56 |
Ik heb vorige week mijn eerste functionele python scriptje gemaakt.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | #!/usr/bin/python
import serial, os ser = serial.Serial('/dev/ttyACM0', 9600, timeout=40)
while True: line= ser.readline() print("iets gelezen") if 'VOL +' in line: print("volume omhoog") os.system("amixer -D pulse sset Master 1%+ > /dev/null") elif 'VOL -' in line: print("volume omlaag") os.system("amixer -D pulse sset Master 1%- > /dev/null") ser.close() |
En nu bediend ik mijn volume met de kaku afstandbediening.  |
#ANONIEM | zondag 8 februari 2015 @ 10:59 |
quote: Op zondag 8 februari 2015 10:56 schreef KomtTijd... het volgende:Ik heb vorige week mijn eerste functionele python scriptje gemaakt. [ code verwijderd ] En nu bediend ik mijn volume met de kaku afstandbediening.  Haha nice. Python leent zich ook super makkelijk voor dit soort dingen. Shell scripts schrijven is eigenlijk overbodig geworden naar mijn mening. Tenzij het echt een paar commando's zijn of zo.
Wat ik wel eens heb is dat ik een grote batch met videobestanden download, die meerdere audio tracks hebben. Met mkvmerge kun je makkelijk de audio-tracks die je niet wilt verwijderen, maar dit zou je dan voor elk bestand moeten doen. Met Python had ik ook een quick 'n dirty-scriptje gemaakt dat even langs de bestanden itereert.
https://github.com/robin0(...)master/dubremover.py |
KomtTijd... | zondag 8 februari 2015 @ 11:10 |
Ik heb echt een bloedhekel aan shell scripting, het is zo'n ontiegelijke syntactische bende... Krijg het nooit voor elkaar dat het gewoon in een keer werkt. Ik heb eerder voor ditsoort scriptjes vaak gewoon PHP gebruikt omdat ik dat ken, maar ga toch vaker python gebruiken denk ik. Toch wel erg makkelijk. |
n8n | zondag 8 februari 2015 @ 14:40 |
Dwingt python nou 4 spaties af of mogen het ook tabs zijn? Beide uiteraard niet door elkaar |
µ | zondag 8 februari 2015 @ 14:51 |
quote: Ik doe 2 spaties . |
KomtTijd... | zondag 8 februari 2015 @ 14:59 |
quote: Mag je helemaal zelf weten, zolang je maar consistent bent.
4 spaties is wel gebruikelijk. Veel IDE's zullen automatisch 4 spaties indenten als je tabt. |
KomtTijd... | zondag 8 februari 2015 @ 15:01 |
Ohja voor iedereen die wil beginnen met programmeren met python:
|
#ANONIEM | zondag 8 februari 2015 @ 17:17 |
quote:
 Ik doe altijd standaard 4 spaties. Wordt ook door Google aanbevolen volgens mij in hun richtlijnen:
https://google-styleguide.googlecode.com/svn/trunk/pyguide.html |
n8n | zondag 8 februari 2015 @ 17:42 |
quote: Op zondag 8 februari 2015 14:59 schreef KomtTijd... het volgende:[..] Mag je helemaal zelf weten, zolang je maar consistent bent. 4 spaties is wel gebruikelijk. Veel IDE's zullen automatisch 4 spaties indenten als je tabt. prima. Ik doe altijd tabs want dan kan iedereen zelf bepalen wat de afstand is. |
n8n | zondag 8 februari 2015 @ 17:43 |
quote: druk je dan 8 keer op spatie per regel die je 4 maal indent?  |
Crutch | zondag 8 februari 2015 @ 18:07 |
Een beetje goede IDE doet dat voor je. |
µ | zondag 8 februari 2015 @ 20:28 |
quote: vim  |
#ANONIEM | zondag 8 februari 2015 @ 22:04 |
quote: Haha, daar bewerk ik ook Python mee. PyDev moet ik nog instellen. |
KomtTijd... | zondag 8 februari 2015 @ 22:25 |
Ik pak gewoon geany.
Gebruiken jullie Python ook voor grotere applicaties? Heb tot nu toe alleen maar scriptjes van een paar regels geschreven. |
#ANONIEM | zondag 8 februari 2015 @ 22:29 |
quote: Op zondag 8 februari 2015 22:25 schreef KomtTijd... het volgende:Ik pak gewoon geany. Gebruiken jullie Python ook voor grotere applicaties? Heb tot nu toe alleen maar scriptjes van een paar regels geschreven. Ik heb bijgedragen aan het project youtube-dl. Is dat groot genoeg? https://github.com/rg3/youtube-dl
Toen ik stage liep heb ik wel bij een bedrijf toch wel een grote applicatie geschreven zien worden in Python.
Calibre is ook in Python.  |
#ANONIEM | zondag 8 februari 2015 @ 22:30 |
Trouwens, even een bezwaar tegen de TT: www.pyladies.com/ |
µ | maandag 9 februari 2015 @ 06:19 |
Django trouwens .
https://www.djangoproject.com/ |
#ANONIEM | maandag 9 februari 2015 @ 07:42 |
quote: Pyramid of iets dergelijks schijnt ook goed te zijn, maar door Django's grote naam blijf ik daaraan plakken.
Iemand ervaring met Django CMS? |
n8n | maandag 9 februari 2015 @ 10:57 |
Django is toch een webframework, vergelijkbaar met Laravel of Phalcon voor php |
#ANONIEM | maandag 9 februari 2015 @ 12:59 |
quote: Jup. Maar er is dus ook een CMS gemaakt in Django.
[ Bericht 0% gewijzigd door #ANONIEM op 11-02-2015 07:10:05 ] |
#ANONIEM | vrijdag 13 februari 2015 @ 12:55 |
Python 4 life.  |
µ | vrijdag 13 februari 2015 @ 14:44 |
quote: Liever python 3 . |
#ANONIEM | vrijdag 13 februari 2015 @ 16:17 |
quote: Hahaha.  |
µ | zaterdag 14 februari 2015 @ 21:11 |
Heeft iemand hier al avro of protocolbuffers gebruikt met python(3)? Ervaringen? |
thabit | zaterdag 14 februari 2015 @ 21:32 |
Zijn er überhaupt mensen die Python 3 gebruiken? |
µ | zaterdag 14 februari 2015 @ 21:45 |
quote: Sure! |
thabit | zaterdag 14 februari 2015 @ 22:41 |
quote: Ik heb de indruk dat Python 3 onnodig backwards-incompatible is, terwijl de "echte fouten" van Python 2 (baggertraagheid en de GIL) niet worden aangepakt. Maar goed, dat is mijn mening. |
n8n | zaterdag 14 februari 2015 @ 22:50 |
Is er een 'python: the good parts' zoals er is voor JS? |
thabit | zaterdag 14 februari 2015 @ 23:05 |
quote: Geen idee; wat zegt Google? |
n8n | zaterdag 14 februari 2015 @ 23:10 |
quote: als het nergens als aanbeveling staat geeft Google ook geen resultaat.
https://www.python.org/dev/peps/pep-0008/ kan ik sowieso lezen |
#ANONIEM | zondag 15 februari 2015 @ 09:51 |
quote: Is niet nodig omdat het niet zoveel bad parts bevat. |
#ANONIEM | zondag 15 februari 2015 @ 09:52 |
quote: Jazeker. Met plezier |
Aether | zondag 15 februari 2015 @ 10:06 |
http://www.computable.nl/artikel.jsp?id=2108203 |
n8n | zondag 15 februari 2015 @ 12:12 |
quote:  |
#ANONIEM | zondag 15 februari 2015 @ 12:26 |
quote: Interessant.  |
Crutch | zondag 15 februari 2015 @ 12:52 |
quote: Ik snap echt niet waar die vim-adorering vandaan komt. Tenzij je een ssh verbinding legt naar de server om daar snel een hotfix te doen omdat een website anders op z'n gat ligt, okay, begrijpelijk.
Maar kom op zeg, normaal development doe je toch op z'n minst met een goede IDE. Zo zonde van tijd he? Het is allemaal wel leuk en aardig om met vim om te kunnen gaan, maar meer dan een omslachtige console-text-editor is het niet.
Dus maak het je gemakkelijk en :q!
[ Bericht 2% gewijzigd door Crutch op 15-02-2015 12:55:23 (regel toegevoegd) ] |
#ANONIEM | zondag 15 februari 2015 @ 13:05 |
quote: Op zondag 15 februari 2015 12:52 schreef Crutch het volgende:[..] Ik snap echt niet waar die vim-adorering vandaan komt. Tenzij je een ssh verbinding legt naar de server om daar snel een hotfix te doen omdat een website anders op z'n gat ligt, okay, begrijpelijk. Maar kom op zeg, normaal development doe je toch op z'n minst met een goede IDE. Zo zonde van tijd he? Het is allemaal wel leuk en aardig om met vim om te kunnen gaan, maar meer dan een omslachtige console-text-editor is het niet. Dus maak het je gemakkelijk en :q! Je OS kun je haast zo inrichten als IDE. Daarnaast heb ik voor Python gewoon autocompletion etc.  |
µ | zondag 15 februari 2015 @ 13:47 |
quote: Met vim kan je dingen die in andere editors een stuk lastiger zijn of niet kunnen; uitgebreide macros, briljante opties voor buffers, regexen werken goed, autocompletion werkt goed. Daarnaast werkt het overal.
quote: Tenzij je een ssh verbinding legt naar de server om daar snel een hotfix te doen omdat een website anders op z'n gat ligt, okay, begrijpelijk.
Maar kom op zeg, normaal development doe je toch op z'n minst met een goede IDE. Zo zonde van tijd he? Het is allemaal wel leuk en aardig om met vim om te kunnen gaan, maar meer dan een omslachtige console-text-editor is het niet.
Dus maak het je gemakkelijk en :q!
Ik zou niet weten wat ik mis in vim, maar misschien heb jij daar een beter idee van. Vroeger werkte ik met eclipse, maar nu werk ik toch echt een stuk sneller. Vim + tmux + python console = . |
n8n | zondag 15 februari 2015 @ 14:04 |
Vim kan je toch niet met de pijltjes door de tekst navigeren. Daar kan k echt niet zonder. |
µ | zondag 15 februari 2015 @ 14:06 |
quote: Dat kan wal . Het is alleen minder efficient.
Zeggen ze dan. Ik gebruik meestal ook de pijltjes. Maar hjkl is efficienter. |
#ANONIEM | zondag 15 februari 2015 @ 14:06 |
quote: Op zondag 15 februari 2015 13:47 schreef µ het volgende:[..] Met vim kan je dingen die in andere editors een stuk lastiger zijn of niet kunnen; uitgebreide macros, briljante opties voor buffers, regexen werken goed, autocompletion werkt goed. Daarnaast werkt het overal. [..] Ik zou niet weten wat ik mis in vim, maar misschien heb jij daar een beter idee van. Vroeger werkte ik met eclipse, maar nu werk ik toch echt een stuk sneller. Vim + tmux + python console =  . Aanrader voor je. vim-jedi  https://github.com/davidhalter/jedi-vim
[ Bericht 5% gewijzigd door #ANONIEM op 15-02-2015 14:07:16 ] |
n8n | zondag 15 februari 2015 @ 14:23 |
quote: Op zondag 15 februari 2015 14:06 schreef µ het volgende:[..] Dat kan wal  . Het is alleen minder efficient. Zeggen ze dan. Ik gebruik meestal ook de pijltjes. Maar hjkl is efficienter. Heb even op YT gekeken tot i, I, s, S, a, A, C en hjkl maar dusver kan alles ook in mijn editor zonder van mode te hoeven wisselen. Vind het maar omslachtig. Edit: w, W, b, B, e, E kan ook allemaal pijnloos. Gebruik zelf ook nooit de muis wanneer ik aan het typen ben. Voordeel is ook dat de standaard navigatie-shortcuts overal werken, ook in deze posts.
|
µ | zondag 15 februari 2015 @ 14:23 |
quote: Ben meer een fan van youcompleteme:

(zo te zien gebruikt YCM jedi voor python idd ) |
µ | zondag 15 februari 2015 @ 14:27 |
quote: Op zondag 15 februari 2015 14:23 schreef n8n het volgende:[..] Heb even op YT gekeken tot i, I, s, S, a, A, C en hjkl maar dusver kan alles ook in mijn editor zonder van mode te hoeven wisselen. Vind het maar omslachtig. Edit: w, W, b, B, e, E kan ook allemaal pijnloos. Gebruik zelf ook nooit de muis wanneer ik aan het typen ben. Voordeel is ook dat de standaard navigatie-shortcuts overal werken, ook in deze posts. In de basis is het gewoon een editor zoals alle anderen, dus daar ga je weinig winst uit halen. het wordt pas spannend als je macros gaat doen, yanken, buffers goed gebruiken et cetera. Eerst zag ik het voordeel ook niet, tot ik een collega de features goed zag gebruiken. Sindsdien ben ik om . |
n8n | zondag 15 februari 2015 @ 14:29 |
quote: Op zondag 15 februari 2015 14:27 schreef � het volgende:In de basis is het gewoon een editor zoals alle anderen, dus daar ga je weinig winst uit halen. het wordt pas spannend als je macros gaat doen, yanken, buffers goed gebruiken et cetera. Heb je daar voorbeelden van?
Macros zou wel handig kunnen zijn maar de voorbeelden die ik vond kan ook met search replace. Yanken vond ik niet zo heel spannend, dat is een actie op het navigeren/selecteren van tekst en dat lukt me al prima zonder muis.
[ Bericht 18% gewijzigd door n8n op 15-02-2015 14:39:56 ] |
µ | zondag 15 februari 2015 @ 14:41 |
quote: Voor macros bijvoorbeeld, stel dat je een bestand hebt met:
1 2 3 | appel, 1 euro, groen banaan, 2 euro, geel kiwi, 1 euro, groen |
En daar wil je dit van maken:
1 2 3 | <a href="product/appel">Appel</a>, ¤1 (groen) <a href="product/banaan">Banaan</a>, ¤2 (geel) <a href="product/Kiwi">Kiwi</a>, ¤1 (groen) |
Dat kan in vim makkelijk.
1 | ^dt,i<a href="product/[esc]pdt,i</a>[esc]p?>~f,i</a>f i¤dt i([esc]A)$j |
ongetest en uit mijn hoofd getypt. Ziet er misschien lastig uit maar het zijn dit soort dingen diehet gebruiken van vim zo efficient maken. |
µ | zondag 15 februari 2015 @ 14:43 |
Ander, simpeler voorbeeld. Stel dat je in je editor een lijn wil verwijderen. Dan moet je eerst zorgen dat je de lijn selecteert en op delete drukken. In vim doe je dd en je bent er. Doe 5dd en je verwijdert 5 lines. Als je een actie doet en je drukt op . dan doet vim het nog een keer voor je, scheelt ook veel tijd. |
n8n | zondag 15 februari 2015 @ 14:48 |
quote: Op zondag 15 februari 2015 14:41 schreef µ het volgende:[..] Voor macros bijvoorbeeld, stel dat je een bestand hebt met: [ code verwijderd ] En daar wil je dit van maken: [ code verwijderd ] Dat kan in vim makkelijk. [ code verwijderd ] ongetest en uit mijn hoofd getypt. Ziet er misschien lastig uit maar het zijn dit soort dingen diehet gebruiken van vim zo efficient maken. Dat is wel een aardig voorbeeld, makkelijk zou ik het alleen niet willen noemen Snap wel dat je hier wat aan hebt in deze vorm. quote: Op zondag 15 februari 2015 14:43 schreef µ het volgende:Ander, simpeler voorbeeld. Stel dat je in je editor een lijn wil verwijderen. Dan moet je eerst zorgen dat je de lijn selecteert en op delete drukken. In vim doe je dd en je bent er. Doe 5dd en je verwijdert 5 lines. Als je een actie doet en je drukt op . dan doet vim het nog een keer voor je, scheelt ook veel tijd. Die lijn selecteren doe ik ondertussen zo snel dat mode switchen me net zo omslachtig lijkt. M’n editor heeft wel VIM-mode, wellicht probeer ik het eens aangezien het een kwestie van 1 sneltoets is om te schakelen.
Dat dd is wel tof ja Kan met cmd, alt, V naar VIM-mode schakelen, toch maar eens leren en de kracht van beide gebruiken (4 modes fuck yeah).
Ok, verder met Python 
[ Bericht 1% gewijzigd door n8n op 15-02-2015 14:53:17 ] |
µ | zondag 15 februari 2015 @ 14:53 |
dd was maar een klein voorbeeld he .

Elke toets doet iets . |
n8n | zondag 15 februari 2015 @ 14:54 |
quote: Ja dat snap ik maar die hele tutorial net ben ik alweer vergeten Het is meer een muscle memory ding want de logica gaat imo nergens over (wat ook haast niet kan met een functie onder elke toets).
 inline commands vind ik dan wel weer smooth
[ Bericht 9% gewijzigd door n8n op 15-02-2015 15:00:47 ] |
µ | zondag 15 februari 2015 @ 15:02 |


En dat is zonde op zich. Maar goed, terug naar de orde van de dag . |
#ANONIEM | dinsdag 24 maart 2015 @ 14:06 |
https://www.paypal-engine(...)f-enterprise-python/ |