Seite 1 von 5

Pythonprog nur ausführbar machen, wenn Bedingung erfüllt?

Verfasst: Mittwoch 4. März 2009, 16:49
von mocca
Hi,

Ich hab ein Python Skript und ich würde ganz gerne dafür sorgen, dass es nur dann ausführbar ist, wenn bestimmte Dateien vorhanden sind.

Sprich ich bräuchte einen Befehl, den ich als rahmen um das komplette skript setzen kann, sodass nichts getan wird, wenn die Dateien nicht vorhenden sind.

ich dachte es wäre ganz einfach mit einem

Code: Alles auswählen

if os.access('/usr/lib/kontrollatei.py', F_OK):
möglich. aber das scheint falsch zu sein.

es sollte auch möglichst eine prüfabfrage sein, die ich direkt hinter die ganzen "import" und "from" einträge hängen kann und somit einfach vor jeglicher sonstiger ausführung ist.

sorry, bin sehr unerfahren in python :(

würd mich über hilfestellung freuen :)


p.s.: ideal wäre ein befehl, bei dem ich beliebig viele dateien vorher auf existenz prüfen lassen kann.


EDIT: hatte das "os." vor "F_OK" vergessen, sorry.

aber gibt es ein zeichen, mit dem ich definieren kann, dass er "ab hier" diese if schleife anwendet und dann definieren, wo er aufhören soll? denn sonst kanns ja sein, dass er mittendrin aufhört, sobald er das nächste else findet.

Verfasst: Mittwoch 4. März 2009, 17:03
von helduel
Moin,

os.path.exists suchst du wahrscheinlich. Könntest dann mit folgendem auch prüfen, ob es alle Dateien gibt:

Code: Alles auswählen

all(map(os.path.exists, ['/etc/passwd', '/etc/groups']))
Gruß,
Manuel

Verfasst: Mittwoch 4. März 2009, 17:05
von mocca
sind einzelne dateien an ganz verschiedenen orten. möchte nicht einen pfad überprüfen.

oder macht das dein code?

und müsste ich dann aber noch ne if schleife davor hängen?

hab den ersten grad nochmal editiert, als du wohl schon geantwortet hattest :)

wofür genau ist dein all(map())

Verfasst: Mittwoch 4. März 2009, 17:15
von helduel
Moin,

da hilft Doku lesen :wink: :
[mod]os.path[/mod]
[mod]functions[/mod]

/etc/passwd und /etc/groups sind Dateien.

Gruß,
Manuel

Verfasst: Mittwoch 4. März 2009, 17:19
von mocca
ich hab jetzt zum test mal die zeile geschrieben (in einer zeile, um indent fehler zu vermeiden :oops: ):

Code: Alles auswählen

if all(map(os.path.exists, ['/usr/lib/plugin.py', '/usr/lib/ni/python/pg.py'])): print "ERFOLGREICH ÜBERPÜFT" else print "Nicht vorhanden"
und ich kriege dann den fehler: "SyntaxError: Non-ASCII character '\xdc' in file ./testschleife.py on line 22, but no encoding declared; see http://www.python.org/peps/pep-0263.html for details"


p.s.: das ist line 22.

Verfasst: Mittwoch 4. März 2009, 17:30
von Hyperion
mocca hat geschrieben: und müsste ich dann aber noch ne if schleife davor hängen?
s. If-Schleife

Edit: Und? Haste Dir mal das PEP durchgelesen? Du musst ein Encoding innerhalb des Python-Scriptes setzen - speziell eines, das Umlaute unerstützt, wie etwa utf-8!

Verfasst: Mittwoch 4. März 2009, 17:36
von helduel
@mocca: Hast du getan, was die Fehlermeldung dir vorschlägt?

Verfasst: Mittwoch 4. März 2009, 17:40
von bwbg
In der Regel setzt man keinen ausführbaren Kode auf Modulebene. Du solltest deinen ausführbaren Teil in eine Funktion setzten und diese dann bei entsprechender Bedingung ausführen lassen.

Code: Alles auswählen

# Exemplarisch:
def main():
    # ... Programm ausführen

if __name__ == '__main__':
    main()
Für deinen Fall, in dem du noch eine zusätzliche Ausführungsbedingung abprüfen möchtest, solltest du diese in einer zusätzlichen Funktion tun.

Code: Alles auswählen

def main():
    # ... Programm ausführen

def bedingung_pruefen():
    # ... Bedingungen für die Ausführung prüfen und
    # ggf. True oder False zurück geben.
    return True

if __name__ == '__main__' and bedingung_pruefen():
    main()
---

So wie ich das jetzt mitverfolge, versuchst du Python-Dateien auf ihre Existenz zu prüfen. Warum importierst du diese nicht einfach (wenn so vorgesehen). In dem Falle, dass diese nicht existieren, wird ohnehin eine Ausnahme (ImportError) geworfen und das Programm (bei Nichtabfangen) abgebrochen.

---

Alles weitere, siehe unten :wink:

Grüße...
Heiko

Verfasst: Mittwoch 4. März 2009, 17:42
von mocca
ja, hatte auf utf-8 umgestellt aber dann kam die fehlermeldung " line 1: ´╗┐#!/usr/bin/python: not found"

@bwbg: sorry, aber ich glaub für sowas ist mein python zu schlecht :(

hätte nix dagegen, aber ich befürchte, das ich das nicht geschrieben kriege....wie man sieht tu ich mir noch schwer.


gibts ne möglichkeit dafür zu sorgen, dass nach der wandlung von .py nach .pyc der pfadname nicht lesbar ist?

Verfasst: Mittwoch 4. März 2009, 17:56
von helduel
Hat nichts mit Python zu tun. Vor der Shebang-Zeile (#!...) sind komische Zeichen, die da nicht hingehören. Mach die weg. Was für einen Editor benutzt du denn?
gibts ne möglichkeit dafür zu sorgen, dass nach der wandlung von .py nach .pyc der pfadname nicht lesbar ist?
Häh?

Verfasst: Mittwoch 4. März 2009, 18:09
von Hyperion
Gabs da nicht mal die Macke einiger Windoof Editoren, bei utf-8 irgend welche komischen Header-Bytes avor zu setzen? Meine das hier schon mal gelesen zu haben ...

Verfasst: Mittwoch 4. März 2009, 18:09
von mocca
:D
die skripte laufen auf einer hardwareplattform (ähnlich dreambox etc.).

wenn die python skripte ausgeführt werden entstehen automatisch .pyc versionen.
nur dies sollen am ende im packet drin sein.

in .pyc kann man letztlich nichts weiter lesen, ausser mit dem hexeditor. und da eben nur dinge, die in "" stehen oder eben pfadangaben. da diese prüfvorschrit sozusagen "non-public" sein soll, würde ich gerne verhindern, dass diese pfadangaben lesbar sind.


und noch ne vielleicht leichtere anfrage: wenn ich mit os.rmdir() einen ordner löschen lassen will, gibts dafür eine art "force", damit auch nicht-leere ordner entfernt werden?

Verfasst: Mittwoch 4. März 2009, 18:10
von Hyperion
mocca hat geschrieben: in .pyc kann man letztlich nichts weiter lesen, ausser mit dem hexeditor. und da eben nur dinge, die in "" stehen oder eben pfadangaben. da diese prüfvorschrit sozusagen "non-public" sein soll, würde ich gerne verhindern, dass diese pfadangaben lesbar sind.
Soll das ne Art Kopierschutz werden? Wenn ja: Vergiss es einfach!

Verfasst: Mittwoch 4. März 2009, 18:13
von mocca
Hyperion hat geschrieben:Soll das ne Art Kopierschutz werden? Wenn ja: Vergiss es einfach!
Im prinzip sowas in der richtung.
wieso vergessen? :(
soll nichts hochsicherheitsmässiges sein, nur eine art vorsichtsmassnahme.

Verfasst: Mittwoch 4. März 2009, 18:26
von cofi
Weil man schon mit einem normalen Editor .pyc recht gut lesen kann. Was soll das denn für eine Vorsichtsmaßnahme sein? Dass Pfade richtig erstellt wurden? Wenn du damit Sicherstellen willst, dass das auch bei dir gekauft wurde, nimm eine passende Lizenz.