<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>deadlime &#187; parancssor</title>
	<atom:link href="http://deadlime.hu/tag/parancssor/feed/" rel="self" type="application/rss+xml" />
	<link>http://deadlime.hu</link>
	<description>unexpected terminator</description>
	<lastBuildDate>Mon, 14 May 2012 20:38:51 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.2</generator>
		<item>
		<title>A kígyó esete a parancssorral I.</title>
		<link>http://deadlime.hu/2008/09/21/a-kigyo-esete-a-parancssorral-1/</link>
		<comments>http://deadlime.hu/2008/09/21/a-kigyo-esete-a-parancssorral-1/#comments</comments>
		<pubDate>Sun, 21 Sep 2008 13:05:01 +0000</pubDate>
		<dc:creator>Nagy Krisztián</dc:creator>
				<category><![CDATA[nincs kategória]]></category>
		<category><![CDATA[parancssor]]></category>
		<category><![CDATA[Python]]></category>

		<guid isPermaLink="false">http://deadlime.hu/?p=127</guid>
		<description><![CDATA[Mostanság parancssori scripteket írogatok Python-ban, ha éppen nincs jobb dolgom (ritka). Gondoltam hát, hogy ezzel kapcsolatos tapasztalataimat és a nyelvvel való ismerkedésemet megosztom egy - egyelőre még nem tudni hány részes - bejegyzéssorozatban. Az első rész témája az alkalmazásnak átadott paraméterek feldolgozása a getopt és az optparse modulok segítségével. A programunk egy egyszerű "Hello World!" [...]]]></description>
			<content:encoded><![CDATA[<p>Mostanság parancssori scripteket írogatok Python-ban, ha éppen nincs jobb dolgom (ritka). Gondoltam hát, hogy ezzel kapcsolatos tapasztalataimat és a nyelvvel való ismerkedésemet megosztom egy - egyelőre még nem tudni hány részes - bejegyzéssorozatban. Az első rész témája az alkalmazásnak átadott paraméterek feldolgozása a <code>getopt</code> és az <code>optparse</code> modulok segítségével.</p>

<p>A programunk egy egyszerű "Hello World!" alkalmazás lesz parancssori stílusban. Két fajta bemenő paramétert fogad el. Az egyik a név, akinek köszönni fog, a másikra pedig megjeleníti a súgót, hogy hogyan is kell paraméterezni ezt a rettentő bonyolult programot.</p>

<h3>A getopt</h3>

<p>A legkézenfekvőbb módszer a paraméterek feldolgozására a <a href="http://docs.python.org/lib/module-getopt.html"><code>getopt</code> modul</a> <code>getopt()</code> függvénye. Szükségünk lesz ezen kívül még a <a href="http://docs.python.org/lib/module-sys.html"><code>sys</code> modulra</a>, hogy a feldolgozandó lista is a birtokunkba kerüljön (mellesleg a <a href="http://hu2.php.net/getopt"><code>getopt()</code> függvény</a> PHP-ban is létezik):</p>

<pre class="code prettyprint lang-python">from getopt import getopt, GetoptError
import sys</pre>

<p>A feldolgozás során a <code>getopt()</code> egy <code>GetoptError</code> kivételt dob, ha nem talál rendben valamit. A függvény első paramétere a bemenő adatok tömbje (az első indextől, mivel a nulladik index az a meghívott fájl neve), a második paraméter a rövid kapcsolók listája (kettőspont van a betűk mögött, amik paramétert várnak), a harmadik paraméter pedig a hosszú kapcsolók listája (egyenlőségjellel a név mögött, ha paramétert várnak). A visszatérési értéke két tömb, az első paraméternév-érték párokat tartalmaz, a második pedig a fel nem dolgozott parancssori argumentumokat.</p>

<pre class="code prettyprint lang-python">try:
    opts, args = getopt(sys.argv[1:], 'hn:', ['help', 'name='])
except GetoptError:
    print 'Parameterezesi hiba'
    sys.exit(1)</pre>

<p>Ha nem szállt el a program hibával, akkor megadjuk a változóinknak (jelen esetben csak a name-nek) az alapértelmezett értékeket és végigmegyünk az <code>opts</code> tömbön, hogy feltölthessük őket valós adatokkal.</p>

<pre class="code prettyprint lang-python">name = False

for opt, arg in opts:
    if opt in ('-h', '--help'):
        print 'usage: %s --name=NAME' % sys.argv[0]
        sys.exit(0)
    elif opt in ('-n', '--name'):
        name = arg</pre>

<p>Nem maradt más hátra, mint a <code>name</code> változó ellenőrzése és siker esetén a köszöntés kiiratása:</p>

<pre class="code prettyprint lang-python">if not name:
    print 'Add meg a nevet!'
    sys.exit(2)

print 'Hello, ' + name + '!'</pre>

<p>Ha a <code>name</code> változó kezdőértéke például <code>'World'</code> lenne, akkor a feldolgozás utáni ellenőrzést el is hagyhatnánk és a programunk működése úgy módosulna, hogy a világot köszöntené, ha nem kap más paramétert.</p>

<h3>Az optparse</h3>

<p>A Python 2.3-as verziója óta rendelkezésre áll az <a href="http://docs.python.org/lib/module-optparse.html"><code>optparse</code> modul</a> is, ami még egy pár gondot levesz a vállunkról méghozzá objektum-orientált módon. Ez esetben a <code>sys</code> modulra nem lesz szükségünk, a parancssori paraméterek begyűjtését az <code>optparse</code> végzi.</p>

<pre class="code prettyprint lang-python">from optparse import OptionParser</pre>

<p>Beállítjuk, hogy milyen paramétereket várunk és azt is, hogy mik lesznek ezeknek az alapértelmezett értékei. Ezek után feldolgozzuk a bejövő adatokat.</p>

<pre class="code prettyprint lang-python">parser = OptionParser()
parser.add_option(
    '-n', '--name',
    dest = 'name',
    help = 'a koszontendo neve',
    metavar = 'NAME'
)
parser.set_defaults(name = False)
opts, args = parser.parse_args()</pre>

<p>Ami azonnal feltűnhet, hogy a <code>-h</code> és <code>--help</code> kapcsolókat nem adtuk meg. Ezt az <code>optparser</code> automatikusan megteszi és még a segítség szövegét is legenerálja nekünk (az <code>add_option()</code> <code>help</code> és  <code>metavar</code> paramétere alapján). A feldolgozás után kapott értékeket az <code>opts</code> tömbben érjük el az <code>add_option()</code>-nak megadott <code>dest</code> paraméter nevű kulcsként.</p>

<pre class="code prettyprint lang-python">if not opts.name:
    parser.error('Add meg a nevet!')

print 'Hello ' + opts.name + '!'</pre>

<p>Ezzel meg is lennénk. Nem tűnik sokkal rövidebbnek a kód, de több paraméter esetén szembetűnőbb lenne a <code>getopt</code> esetén a kód közepén az a hatalmas <code>if-elif</code> erdő. Ezen kívül ugye egy elég szép súgó kimenetet generál nekünk és bizonyos fokig kezeli a hibákat is (üres paraméter, nem numerikus paraméter - ha az van beállítva) egy kulturált hibakimenetet mutatva.</p>

<h3>Példafájlok</h3>

<ul>
    <li><a href="http://kriz.deadlime.hu/python/hello_world_getopt.py"><code>getopt</code> példafájl</a></li>
    <li><a href="http://kriz.deadlime.hu/python/hello_world_optparse.py"><code>optparse</code> példafájl</a></li>
</ul>

<p>A következő részben előreláthatólag különböző konfigurációs fájlok feldolgozásának módjáról lesz szó. Addig is kellemes paraméterezést.</p>]]></content:encoded>
			<wfw:commentRss>http://deadlime.hu/2008/09/21/a-kigyo-esete-a-parancssorral-1/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

