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

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
mocca
User
Beiträge: 84
Registriert: Mittwoch 4. März 2009, 16:44

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.
Zuletzt geändert von mocca am Mittwoch 4. März 2009, 17:03, insgesamt 1-mal geändert.
Benutzeravatar
helduel
User
Beiträge: 300
Registriert: Montag 23. Juli 2007, 14:05
Wohnort: Laupheim

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
mocca
User
Beiträge: 84
Registriert: Mittwoch 4. März 2009, 16:44

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())
Benutzeravatar
helduel
User
Beiträge: 300
Registriert: Montag 23. Juli 2007, 14:05
Wohnort: Laupheim

Moin,

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

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

Gruß,
Manuel
mocca
User
Beiträge: 84
Registriert: Mittwoch 4. März 2009, 16:44

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.
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

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!
Benutzeravatar
helduel
User
Beiträge: 300
Registriert: Montag 23. Juli 2007, 14:05
Wohnort: Laupheim

@mocca: Hast du getan, was die Fehlermeldung dir vorschlägt?
Benutzeravatar
bwbg
User
Beiträge: 407
Registriert: Mittwoch 23. Januar 2008, 13:35

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
"Du bist der Messias! Und ich muss es wissen, denn ich bin schon einigen gefolgt!"
mocca
User
Beiträge: 84
Registriert: Mittwoch 4. März 2009, 16:44

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?
Benutzeravatar
helduel
User
Beiträge: 300
Registriert: Montag 23. Juli 2007, 14:05
Wohnort: Laupheim

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?
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

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 ...
mocca
User
Beiträge: 84
Registriert: Mittwoch 4. März 2009, 16:44

: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?
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

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!
mocca
User
Beiträge: 84
Registriert: Mittwoch 4. März 2009, 16:44

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.
Benutzeravatar
cofi
Python-Forum Veteran
Beiträge: 4432
Registriert: Sonntag 30. März 2008, 04:16
Wohnort: RGFybXN0YWR0

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.
Benutzeravatar
helduel
User
Beiträge: 300
Registriert: Montag 23. Juli 2007, 14:05
Wohnort: Laupheim

Schau dir mal [mod]shutil[/mod] an, da gibt's sowas.

Über Sinn und Unsinn einer "Art Vorsichtsmaßnahme" will ich mal nicht philosophieren. Wenn du sowas undebingt haben willst, dann kodiere die Pfade mit Base64 oder verschlüssle gleich richtig. Wenn du die Pfade brauchst, dann dekodiere/entschlüssle einfach. Das wäre aber Security by Obscurity; wenn jemand an die Daten ran will, dann kommt er da auch dran.

Gruß,
Manuel
mocca
User
Beiträge: 84
Registriert: Mittwoch 4. März 2009, 16:44

ne, soll nur sicherstellen, dass es nur dann läuft, wenn eine bestimmte datei im system vorhanden ist. im prinzip so, als würde es prüfen, ob die lizenz vorhanden ist und damit man die lizenz nicht einfach nimmt und auf ein fremdsystem kopiert, soll man nicht gleich sehen, in welchem ordner die liegt.

das ganze ist kostenlos und ist nur eine vorsichtsmassnahme, weil es in einer definierten hard-/software umgebung laufen muss, weil sonst das ganze system crashen kann.
da die leute aber unbedacht machen was sie wollen, will ich da eine entsprechend schlichte routine einbauen, die guckt, dass die korrekte software drauf ist und die korrekte hardware (anhand der treiberdateien) und nur dann ausführbar ist.

selbst die, die nicht gnz so python bewandert sind kriegen es hin die korrekten dateien in ein fremdsystem zu kopieren, wenn die ganzen links in der .pyc in klarschrift sind. deshalb wärs cool, wenn das nicht der fall wäre.


p.s.: jemand ne lösung, wie ich nicht-leere ordner löschen kann? alternativ, wenn das garnicht geht, muss ich irgendwie in der syntax grad was verraffen, denn ein "os.remove('/blahblah/*')" funktioniert nicht, um alle dateien zu löschen. sprich in python is "*" nicht der gleiche platzhalter wie in shell/bash oder windows. welchen müsste ich da stattdessen nehmen?
Benutzeravatar
helduel
User
Beiträge: 300
Registriert: Montag 23. Juli 2007, 14:05
Wohnort: Laupheim

Ich zitiere mich mal selbst:
Schau dir mal [mod]shutil[/mod] an, da gibt's sowas.
mocca
User
Beiträge: 84
Registriert: Mittwoch 4. März 2009, 16:44

:D
sorry, stand auf dem schlauch. hab in dem link nach lösungen für mein sicherheitsproblem gesucht.

shutil hab ich jetzt mal importiert und wird halt einfach mit installiert. sehr schön. wieder ein problem weniger.

bleibt nur noch das unlesbarmachen der pfadangaben.
Benutzeravatar
helduel
User
Beiträge: 300
Registriert: Montag 23. Juli 2007, 14:05
Wohnort: Laupheim

Für globbing ist das glob-Modul zuständig. Ansonsten könnstest du wahrscheinlich mittels os.walk sowas wie rmtree selbst implementieren.
Antworten