1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | 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 ) ) |
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.quote:Op vrijdag 28 december 2007 17:16 schreef colourAgga het volgende:
Nog meer vragen? Stel ze gerustIk zal hier binnenkort ook wat code neerzetten. Ik vraag me gewoon af of veel mensen op FOK! ook daadwerkelijk wat doen met Python.
quote:<Sonium> someone speak python here?
<lucky> HHHHHSSSSSHSSS
<lucky> SSSSS
<Sonium> the programming language
Ik dacht dat alleen COBOL dat had, haha.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, moetquote: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...
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 | 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 |
Die staat in de m'n bookmarks! Het ziet er zeker erg interessant uit!quote:
en is het menuitem 'Shell' niet aanwezig. Niet handig, want het restarten van de shell (Ctrl-F6) werkt dan ook niet meer...quote:IDLE 1.2.1 ==== No Subprocess ====
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.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.
Juist ja. Perl wordt toch ook gebruikt als scripttaal? Is PHP ook voor mietjes? En Python kan ook gecompileerde programma's afleveren...quote:
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.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 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?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.
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: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.
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?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.
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: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?
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.
Ik zou eens hier kijken: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.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?
Helaas Windows niet, toch?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.
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.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?
Tuurlijk wel, hoe kom je daar nou bij?quote:
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.
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 ?quote:Op woensdag 4 juni 2008 19:18 schreef slakkie het volgende:
http://sourceforge.net/projects/mysql-python
Google: mysql python windows
Good luck.
Met "het lukt niet" ("het lijkt ongelijk"??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!
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)...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.
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...quote:Op woensdag 11 juni 2008 15:14 schreef Dzy het volgende:
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
Het implementeren van de mysql for python2.5 module. Hoe krijg ik dat voor mekaar?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.
Preciesquote: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...
1 |
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.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 ]
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.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.
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.
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.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.
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.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.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.
Uiteraard:quote:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | 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() |
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.)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
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 FAQquote:Op dinsdag 24 juni 2008 19:15 schreef slacker_nl het volgende:
Kan je niet beter while row = cs.fetchone(): doen?
1 2 3 4 | row = cs.fetchone() if row == None: break # do stuff |
Met wegschrijven bedoel ik het INSERT-en in m'n tabel. De rest van je tips ga ik nu uitproberen.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’.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 | 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 |
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 <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. |
1 2 3 4 5 | # Strip .py from file import OSS.bladelogic.file k = file.file() k.do_stuff() |
Wat je wilt gebruiken is __import__. Zie hier een proof of concept: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 ]
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | 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() |
1 2 3 | def hello(self): print "Hello from %s." % __file__ |
1 2 3 4 5 6 7 8 9 10 11 12 | 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") |
En het werkt nu ook onder jython:quote:Op maandag 25 augustus 2008 20:37 schreef slakkie het volgende:
Overigens werkt de __import__ functie niet met jython (v2.2.1).
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 | 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) |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | 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/ |
1 2 3 4 5 | def eggs(self): x = 1 + 2 r = str(x) return r |
1 2 3 4 | >>> s = spam.spam() >>> s.eggs() '3' |
1 2 3 4 5 6 7 8 | def comp(self, s): self.change=list(s) reversed=self.change.reverse() stringreversed="".join(reversed) print "Reversed version", stringreversed return Sequence(stringreversed) |
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?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.
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: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.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | 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 |
1 2 3 | revstr = '' .... |
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.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…
Ik heb deze code, maar als output krijg ik een laptekst aan elkaar.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()
Hoe kan ik dat het beste aanpakken?quote:
1
2
3
4
hoofdpagina
/ \
cpuinfo freemem
Volgens mij niet. Als ik het zo bekijk zul je een Queue of een Pipe moeten gebruiken.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?
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.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!
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
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 | """ 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 |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 | 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 |
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!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.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.
1 | stdscr.refresh() |
Heb je hier misschien wat aan?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!
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?quote:Op zondag 20 april 2014 16:20 schreef robin007bond het volgende:
[..]
Heb je hier misschien wat aan?
https://wiki.python.org/moin/ImageMagick
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 |
Wat is het nut van een try zonder catch?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 ]
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() |
Oké. Hmm. Ik ben gewend om objectgeoriënteerd te programmeren, dus het is even wennen voor mij om een lijst met functies te lezen.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!
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. |
1 2 | # start recording the stream in format h264 camera.start_recording(stream, format = 'h264') |
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 |
1 2 | def num_pairs(num_items): return num_items * (num_items - 1) / 2 |
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 |
While(true) is een oneindige loop die pas stopt als het programma stopt als ik mij niet vergis.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 lerenmaar 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?
Tenzij er een break komt dan, want die zit er ook inquote:Op dinsdag 22 april 2014 21:39 schreef robin007bond het volgende:
[..]
While(true) is een oneindige loop die pas stopt als het programma stopt als ik mij niet vergis.
Precies! Wat ook zou kunnen is een boolean daarvoor aanmaken. Vind ik persoonlijk wel netter.quote:Op dinsdag 22 april 2014 21:39 schreef Chandler het volgende:
[..]
Tenzij er een break komt dan, want die zit er ook in
1 2 3 4 5 | shouldLoop = True # maar dan een betere naam! while(shouldLoop): if blablablaconditie: shouldLoop = False |
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' |
1 2 | timer_array = [{'each': 5, 'last': time.time(), 'time': 0, etc}, {'each': 0.25, 'last': time.time(), 'time': 0, etc}] |
1 | for (key, s) in timerArray.items(): |
1 | for s in timerArray: |
1 | locals()[s['execute']]() |
1 | s['execute']() |
1 | for s in timerArray: |
1 2 3 | timerArray[0]['execute'] = 'takeTimeleapseShot' ... timerArray[1]['execute'] = 'takeMovementShot' |
1 2 3 | timerArray[0]['execute'] = takeTimeleapseShot ... timerArray[1]['execute'] = takeMovementShot |
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 |
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)) |
Dit werkte niet met deze arrayquote:Op woensdag 23 april 2014 07:55 schreef thabit het volgende:
[ code verwijderd ]
Dat moet je veranderen in:
[ code verwijderd ]
1 2 | timerArray = [{'each': 5, 'last': time.time(), 'time': 0, 'timemin': 0, 'timem...}, {'each': 0.25, 'last': time.time(), 'time': 0, 'timemin': 0, 'timem...}] |
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; |
1 2 3 4 5 | dir = my_custom_dir . '/' . iets(); doen # maar os.path.join(my_custom_dir, iets(), dit(), dat()); |
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(); |
Verder moet je meer commentaar in je code zetten, en daarmee bedoel ik dat je je functies moet documenteren.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:
Krijg je geen kramp in je pink van al die puntkomma's?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.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.
Blijft wennen. Die catch deed ik ook per ongeluk.quote:Op woensdag 23 april 2014 19:39 schreef thabit het volgende:
[..]
Krijg je geen kramp in je pink van al die puntkomma's?
Ja;quote:Op woensdag 23 april 2014 19:39 schreef thabit het volgende:
[..]
Krijg je geen kramp in je pink van al die puntkomma's?
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) |
Klopt, op zich niet zo erg toch zolang het er maar geen 10+x in staat, maar heb het gelijk een functie gegevenquote: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:
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 |
Ik gebruik idd no os.path.join, is duidelijkerquote:Verder zou ik niet ..
[ code verwijderd ]
Dat fixed je shit ook op een ander platform (denk Windows portability).
Doe ik reeds: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
1 | camera.capture(stream, format = 'jpeg', use_video_port = True, resize = (motionShotWidth, motionShotHeight)) |
Is idd handiger, ben er al druk doende meequote: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).
Klopt, hoeft ook niet, ga er gewoon vanuit dat het werktquote: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.
Ga ik proberen!quote:
Veel! Ik zie het ook vaker in je PHP code, dus je hebt er een handje naarquote: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?
Dan kan die diskspace check er ook uit!quote:Klopt, hoeft ook niet, ga er gewoon vanuit dat het werktdit scriptje hoeft niet alles af te vangen
Valt toch wel mee?quote:Op vrijdag 25 april 2014 15:46 schreef slacker_nl het volgende:
Veel! Ik zie het ook vaker in je PHP code, dus je hebt er een handje naar
Kan, maar vind een nette exit wel een stuk leukerquote:Dan kan die diskspace check er ook uit!
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() |
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.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.
Ik doe 2 spatiesquote:Op zondag 8 februari 2015 14:40 schreef n8n het volgende:
Dwingt python nou 4 spaties af of mogen het ook tabs zijn? Beide uiteraard niet door elkaar
|
Forum Opties | |
---|---|
Forumhop: | |
Hop naar: |