Seite 1 von 4
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
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

:
[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

):
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
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
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.
Verfasst: Mittwoch 4. März 2009, 18:31
von helduel
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
Verfasst: Mittwoch 4. März 2009, 18:35
von mocca
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?
Verfasst: Mittwoch 4. März 2009, 18:40
von helduel
Ich zitiere mich mal selbst:
Schau dir mal [mod]shutil[/mod] an, da gibt's sowas.
Verfasst: Mittwoch 4. März 2009, 18:46
von mocca
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.
Verfasst: Mittwoch 4. März 2009, 18:55
von helduel
Für globbing ist das glob-Modul zuständig. Ansonsten könnstest du wahrscheinlich mittels os.walk sowas wie rmtree selbst implementieren.