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

keppla hat geschrieben:hmm, sagen wir mal, warum auch immer (bug, usereingabe) zeigt die obfuscatete "ku"-variable auf ~ oder /etc/passwd... ich würd ja bei soviel mühe, die funktion zu verbergen, auf böswilligkeit tippen ;)
dafür, dass du mich nicht kennst...

das ist keine Böswilligkeit!!!!

das dient dazu, nicht das betriebssystem des gerätes abzuschiessen (es werden sicherheitshalber die ausführbaren .py entfernt), wenn jemand das programm in verbindung mit dem falschen betriebssystem benutzt und um sicherzustellen, dass es nur mit einem bestimmten betriebssystem eingesetzt wird.

in meinem ganzen code steckt nirgendwo auch nur eine zeile, die absichtlich schaden anrichtet oder programme löscht, die nicht von mir installiert wurden!

es werden nur die bei der installation kopierten dateien meines paketes teilweise entfernt!

müsste so eine anschludigung eigentlich garnicht kommentieren, aber ich will das klarstellen!
Benutzeravatar
cofi
Python-Forum Veteran
Beiträge: 4432
Registriert: Sonntag 30. März 2008, 04:16
Wohnort: RGFybXN0YWR0

Ich bezweifel dass es keppla darum ging dich zu beleidigen, sondern ich denke er meint das vom rechtlichen Standpunkt aus. Ich finde die Schlussfolgerung durchaus nachvollziehbar.

Zum OSError: Das Ding heisst OSError, nicht OS.Error ;)
http://docs.python.org/library/exceptions.html hat geschrieben:exception OSError

This exception is derived from EnvironmentError. It is raised when a function returns a system-related error (not for illegal argument types or other incidental errors). The errno attribute is a numeric error code from errno, and the strerror attribute is the corresponding string, as would be printed by the C function perror. See the module errno, which contains names for the error codes defined by the underlying operating system.

For exceptions that involve a file system path (such as chdir() or unlink()), the exception instance will contain a third attribute, filename, which is the file name passed to the function.
Zu den Lizenzen: Das war schon immer so ;) Nur rückt das mit der erstarkenden OSS / CC Bewegung immer mehr ins Blickfeld der Öffentlichkeit bzw. es gibt nun halt "Standards" früher hatte da halt jeder sein proprietäres Süppchen. Nicht unter gleicher, aber das wäre wohl mit das einfachste. ShareAlike heisst, dass die neue Lizenz ähnliche Freiheiten bereitstellen muss. Wie genau das bei CC aussieht weiss ich nicht, aber vielleicht gibt es ja Kompatibilitätstabellen ähnlich der GPL.
mocca
User
Beiträge: 84
Registriert: Mittwoch 4. März 2009, 16:44

Zum OSError: Das Ding heisst OSError, nicht OS.Error
ups, ja klar. hatte es richtitg ins skript und falsch in den post geschrieben :roll:
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

cofi hat geschrieben:Nur rückt das mit der erstarkenden OSS / CC Bewegung immer mehr ins Blickfeld der Öffentlichkeit bzw. es gibt nun halt "Standards" früher hatte da halt jeder sein proprietäres Süppchen. Nicht unter gleicher, aber das wäre wohl mit das einfachste. ShareAlike heisst, dass die neue Lizenz ähnliche Freiheiten bereitstellen muss. Wie genau das bei CC aussieht weiss ich nicht
Deswegen gehe ich CC soweit wie möglich aus dem Weg. Der NC-Teil heißt für mich sofort unfrei (selbst die GPL erlaubt kommerzielle Nutzung und diese finde ich sinnvoll. Schließlich ist auch viel freie Software komerziell in Benutzung und einige Leute werden gesponsort/bezahlt). Der BY-Part klingt für mich wie Advertising-Klausel die inzwischen kaum noch jemand in der BSD-Lizenz verwendet. SA klingt wie das Copyleft der GPL was wohl noch halbwegs ok ist, aber auch nicht für alle.

CC ist hauptsächlich für Medien gedacht, insofern kann ich BY und SA noch verstehen, aber NC halte ich für schädlich. Schade das Leute ganz oft genau diese Lizenz denken eben weil sie meinen jemand macht mit ihren Werken mehr Geld als sie selbst.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
BlackJack

@Leonidas: Ich denke NC hat seine Berechtigung, weil so Werke unter CC gestellt werden können, bei denen das aus irgend welchen Gründen sowieso gefordert wird. Beim Urteil zu Wahlmaschinen gab's Anfang zum Beispiel so eine "Vervielfältigen ist okay, aber nur zu nicht-kommerziellen Zwecken"-Anmerkung.

Und bei Bildern kann ich mir das auch vorstellen. Runterladen als persönlicher Desktophintergrund oder Poster selber drucken ist okay, aber für "kommerzielle" Poster möchte der Künstler oder die Erben gerne Geld sehen.
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Dann hätte man zu CC einen Anhang machen können, so wie das bei Qt < 4.5 auch der Fall ist. So wie ich das sehe Nutzen Leute oftmals bedenkenlos NC eben weil es zur Auswahl steht. Letztenlich passiert das gleiche auch mit der GPL ganz oft, dass Leute einfach Zeug GPL lizensieren ohne sich der Folgen bewusst zu sein.

Aber nehmen wir ein Beispiel: ich möchte in meinem Laden Musik spielen. Nun ist diese Musik CC-BY-SA-NC. Also müsste ich jede Band einzeln ankündigen? Also müsste ich einzeln den Bands hinterherrennen um komerzielle Lizenzen zu bekommen? Da kommt mich GEMA-Gebühren zahlen stressfreier und ich habe eine wesentlich größere Auswahl. Oder ich halte mich nicht an NC. Vor allem, da ich vermute dass die meisten Autoren nicht sowas mit "NC" meinen und gegen Hintergrundmusik im Laden vermutlich nix hätten.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
BlackJack

Ist denn Hintergrundmusik in einem Laden "Commercial"? Hätte ich jetzt spontan mal verneint, weil man mit der Musik nicht primär Geld verdient.

Ankündigen muss man IMHO nicht weil es sich nur um Wiedergabe handelt und nicht um Weitergabe oder Erschaffung eines abgeleiteten Werks.
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

BlackJack hat geschrieben:Ist denn Hintergrundmusik in einem Laden "Commercial"? Hätte ich jetzt spontan mal verneint, weil man mit der Musik nicht primär Geld verdient.
CC Website hat geschrieben:The licensor permits others to copy, distribute, display, and perform the work, including for commercial purposes.
"Perform the work" würde ich sagen, ist eben die Frage ob es commercial ist. Wenn du die GEMA fragst ist Hintergrundmusik im Laden durchaus kommerziell (zum Beispiel muss ein Frisörsalon zahlen obwohl es den Kunden herzlich egal ist ob die Musik da ist oder nicht). Ist es laut CC kommerziell? Weiß nicht (könnte man vermutlich in der Version für Rechtsanwälte feststellen; ich lese lieber erbaulichere Sachen als Lizenzen), aber sicher ist das der NC-Teil mehr Probleme verursacht als alle gängigen freien Softwarelizenzen.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
mocca
User
Beiträge: 84
Registriert: Mittwoch 4. März 2009, 16:44

naja, wenn man musik in einem geschäft im hintergrund laufen lässt, dann dient dies dazu den kunden zu unterhalten. man versucht damit den aufenthalt angenehmer zu machen.
ein glücklicherer kunde, der den laden nicht gleich wieder verlässt kauft eher was -> indirekt kommerziell

gerde beim frisör, wenn man nicht zu denen gehört, die dort den neuesten tratsch diskutieren :D

und wie sehr man sowas merkt, ist mir mal im fussballstadion aufgefallen. da war bei einem spiel die soundanlage ausser betrieb vor dem spiel und das war GAAAANZ komisch. obwohl man nie zuhört, merkt man ganz extrem wenn es fehlt.


bei CC würde ich da eher "display the work" als "perform the work" sagen. denn du spielst die musik nicht selbst (du als musiker), sondern du spielst das original ab.
also displayst du das werk. da es musik ist ist da das zeigen/vorführen/displayen eben nicht optisch, sonder akustisch.
Benutzeravatar
keppla
User
Beiträge: 483
Registriert: Montag 31. Oktober 2005, 00:12

mocca hat geschrieben:
keppla hat geschrieben:hmm, sagen wir mal, warum auch immer (bug, usereingabe) zeigt die obfuscatete "ku"-variable auf ~ oder /etc/passwd... ich würd ja bei soviel mühe, die funktion zu verbergen, auf böswilligkeit tippen ;)
dafür, dass du mich nicht kennst...
das ist keine Böswilligkeit!!!!
komm mal runter.
wie schon gesagt wurde: ich unterstelle dir nicht böswilligkeit, ich stelle nur fest, dass es für mich nach böswilligkeit aussehen würde, würde dein programm was beschädigen,
(zb durch einen bug) und ich müsste das beurteilen, wenn ich diesen thread nicht kennen würde.
in meinem ganzen code steckt nirgendwo auch nur eine zeile, die absichtlich schaden anrichtet oder programme löscht, die nicht von mir installiert wurden!
Deshalb schrieb ich "bug oder fehlerhafte usereingabe".
das dient dazu, nicht das betriebssystem des gerätes abzuschiessen.
ich glaube, ich bin nicht der einzige, dem immer noch nicht klar ist, wie du das durch intransparenz erreichen willst, und ich bin mir recht sicher, dass du das so nicht erreichst.
Ich glaube dir, dass du nichts böses willst, aber die einstellung, dass du einen user bevormunden musst, der die rechte hat, die ausreichen, dinge kaputtzumachen, indem du
die funktion verschleierst, anstatt ihm zu ermöglichen, nachzuvollziehenm, warum du sperren einbaust, ist etwas.... arrogant.

und dass man dich da eventuell als missetäter missversteht (was ich nicht getan hab) ist da imho nicht unwahrscheinlich, wenn doch mal was schieflaufen sollte

(sorry fürs post.lower(), ich tippe einhändig)
mocca
User
Beiträge: 84
Registriert: Mittwoch 4. März 2009, 16:44

ich nochmal :)

bin auf ein neues problem gestossen :(

also, ich muss das skript von einem anderen aus aufrufen. das verlangt das system so.

und zwar muss dazu eine "def main(session, **kwargs)" definiert sein.
diese soll mir nun mein pythonskript aufrufen.

nun ist es so, dass das skript funktioniert, wenn ich es direkt aufrufe. sprich wenn ich nur das skript selbst aufrufe läuft es. sobald ich es vom anderen skript aufrufen lasse, geht es nicht.

Code: Alles auswählen

def main(session, **kwargs):
    os.execvp('/pfad/skript.py', ['arg1', 'arg2'] )    
habs auch schon mit os.system probiert, alle haben das gleiche problem.

wenn ich ein reines skript nehme, indem ich nur den os.execvp befehl ausführe funktioniert es. nur ist es eben innerhalb einer def main verboten.

jedenfalls, wenn mein skript in dieses def main direkt einbaue, dann bekomme ich eine fehlermeldung
SyntaxError: unqualified exec is not allowed in function 'main' it contains a nested function with free variables
man darf also offensichtlich in def main diese exec funktion nicht ausführen. dieser aufruf macht aber keine probleme, wenn ich das skript.py direkt aufrufe.

gibt es eine möglichkeit dieses problem zu umgehen, ohne dass ich den exec befehl ersetzen muss?
Benutzeravatar
cofi
Python-Forum Veteran
Beiträge: 4432
Registriert: Sonntag 30. März 2008, 04:16
Wohnort: RGFybXN0YWR0

Code: Alles auswählen

import subprocess
subprocess.call(["python", "pfad", "arg1", "arg2"])
Wenn das nicht genau das ist was du willst, dann schau dich im subprocess Modul um.

Andere Möglichkeit wäre es das Skript dynamisch zu importieren. Wenn `import' nicht geht, schau dir das `imp'-Modul an.
BlackJack

@mocca: Die Fehlermeldung hat nichts mit dem gezeigten Quelltext zu tun. `os.execvp()` ist etwas völlig anderes als die ``exec``-Anweisung, die in der Fehlermeldung erwähnt wird.

Könntest Du vielleicht nochmal etwas genauer beschreiben was von wo aus aufgerufen werden soll? Sollst Du ein Skript aufrufen, also starten, oder eine Funktion in einem Modul, also importieren und dann die Funktion aufrufen?
mocca
User
Beiträge: 84
Registriert: Mittwoch 4. März 2009, 16:44

achso, sorry. die execvp anweisung im geposteten code ist ja der aufruf des anderen skriptes in dem dann wiederum die exec anweisung ist.

ist konnte das ganze aber nun lösen, indem ich das ganze als session.os.execvp statt direkt als os.execvp aufgerufen habe :)
mocca
User
Beiträge: 84
Registriert: Mittwoch 4. März 2009, 16:44

also, ich habs doch nicht lösen können :(

hatte nur die eine subroutine in den einstellungen deaktiviert und vergessen zu reaktivieren gehabt, dashalb liefs.

also, nach wie vor läuft das programm 1a, wenn ich es manuell aus der konsole starte aber läuft nicht, wenn ich es aus der def main aufrufe. vermutlich aufgrund von fehlern.

kann ich ihm eventuell sagen er soll die meldungen ignorieren und trotzem alles ausführen? eventuell mittels sowas wie OSError?
oder geht das nicht?

das mit dem subprocess krieg ich irgendwie nciht hin. das will er nicht annehmen. meine syntax stimmt nicht.

Code: Alles auswählen

import subprocess
subprocess.call(["skript.py", "/testerei/skripte/", "arg1", "arg2"])
wäre das so richtig oder ist das falsch?

ansonsten bin ich nciht sicher, ob subprocess vielleicht das ist wonach ich jetzt frage, denn ich hab die erklärung nicht 100% verstanden, abe ist es möglich einen prozess einfach abzusetzen, ohne irgendwie den prozess weiter zu überwachen?

sprich, er soll nicht prüfen, ob die datei fehler hat oder illegale operationen, die im def main nicht laufen dürfen, sondern mehr sowas wie echo "hallo", bei dem eifnach nur ein befehl rausgeht und auf nichts und niemanden gewartet wird und nichts eprüft wird?

ich nehme mal an, dass wenn ich sowas machen würde:

Code: Alles auswählen

import os

def main(session, **kwargs):
    session.open(next)

def next(session, **kwargs):
    self.session = os.system('python/skripte/skript.py')
das trotzdem nicht geht, weil er zwar ein anderes aufruft aber er nach wie vor innerhalb des main ausführt?

muss doch irgendwie gehen, dass er sich für nix interessiert und einfach nur exakt das gleiche macht als wenn ich in der konsole "./skipt.py" eingebe.
denn dann funktionierts.
meinetwegen darf er statt des python skripts auch ein shell skript aufrufen und das ruft dann das python skript auf, aber ich nehme an, dass ich dann wieder innerhalb des main bin und es einfach nun 2 unterprozesse sind, die innerhalb main laufen.



EDIT: ganz vergessen, das hier ist der exec aufruf, der angeblich nicht erlaubt ist in def main:

Code: Alles auswählen

            exec('import '+DDIR+'.' + mod_name)
            exec('fetchdata='+DDIR+'.'+ mod_name +'.get_cache(CONF_DLMODDIR,CONF_CACHEDIR,FIELD_SEPARATOR)')
BlackJack

Versuchs mal ohne ``exec``. Module importieren kann man zum Beispiel auch mit der `__import__()`-Funktion.
Benutzeravatar
cofi
Python-Forum Veteran
Beiträge: 4432
Registriert: Sonntag 30. März 2008, 04:16
Wohnort: RGFybXN0YWR0

@mocca schau dir nochmal meinen letzten Post an ;)
mocca
User
Beiträge: 84
Registriert: Mittwoch 4. März 2009, 16:44

cofi hat geschrieben:@mocca schau dir nochmal meinen letzten Post an ;)
achso. also so?

Code: Alles auswählen

subprocess.call('import '+DDIR+'.' + mod_name)
subprocess.call('fetchdata='+DDIR+'.'+ mod_name +'.get_cache(CONF_DLMODDIR,CONF_CACHEDIR,FIELD_SEPARATOR)')
@blackjack: meinst du dann

Code: Alles auswählen

__import__('import '+DDIR+'.' + mod_name)
__import__('fetchdata='+DDIR+'.'+ mod_name +'.get_cache(CONF_DLMODDIR,CONF_CACHEDIR,FIELD_SEPARATOR)')

EDIT: also, ersteres mit subprocess muss ich was falsch haben :(
bekomme dann

Code: Alles auswählen

Traceback (most recent call last):
  File "./skript.py", line 151, in <module> subprocess.call('import '+DLMODDIR+'.' + mod_name)
  File "/skript/modules/subprocess.pysubprocess.py", line 431, in call return Popen(*args, **kwargs).wait()
  File "/skript/modules/subprocess.pysubprocess.py", line 557, in __init__ errread, errwrite)
  File "/skript/modules/subprocess.py", line 986, in _execute_child raise child_exception
OSError: [Errno 2] No such file or directory
mocca
User
Beiträge: 84
Registriert: Mittwoch 4. März 2009, 16:44

also am liebsten wäre mir ein aufruf, der wirklich einen befehl absetzt und dabei nix kontrolliert, nichts nachverfolgt...nichts.

befehl raus, egal was es ist und fertig.

einfach einen shell befehl ausführen, egal was kommt.

konkret für die datei /skripte/testskript.py
derdon
User
Beiträge: 1316
Registriert: Freitag 24. Oktober 2008, 14:32

Code: Alles auswählen

from os import path
import subprocess
file_name = path.abspath(path.join('skripte', 'testskript.py'))
# ohne argumente
subprocess.call([file_name])
# mit argumenten
subprocess.call([file_name, arg1, arg2])
Antworten