Seite 3 von 4

Verfasst: Donnerstag 5. März 2009, 23:00
von mocca
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!

Verfasst: Donnerstag 5. März 2009, 23:18
von cofi
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.

Verfasst: Donnerstag 5. März 2009, 23:32
von mocca
Zum OSError: Das Ding heisst OSError, nicht OS.Error
ups, ja klar. hatte es richtitg ins skript und falsch in den post geschrieben :roll:

Verfasst: Freitag 6. März 2009, 01:05
von Leonidas
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.

Verfasst: Freitag 6. März 2009, 01:44
von 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.

Verfasst: Freitag 6. März 2009, 01:54
von Leonidas
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.

Verfasst: Freitag 6. März 2009, 09:49
von 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.

Verfasst: Freitag 6. März 2009, 10:11
von Leonidas
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.

Verfasst: Freitag 6. März 2009, 12:37
von mocca
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.

Verfasst: Freitag 6. März 2009, 15:49
von keppla
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)

Verfasst: Montag 9. März 2009, 01:59
von mocca
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?

Verfasst: Montag 9. März 2009, 07:01
von cofi

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.

Verfasst: Montag 9. März 2009, 10:30
von 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?

Verfasst: Montag 9. März 2009, 14:10
von mocca
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 :)

Verfasst: Montag 9. März 2009, 19:33
von mocca
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)')

Verfasst: Montag 9. März 2009, 21:35
von BlackJack
Versuchs mal ohne ``exec``. Module importieren kann man zum Beispiel auch mit der `__import__()`-Funktion.

Verfasst: Montag 9. März 2009, 21:39
von cofi
@mocca schau dir nochmal meinen letzten Post an ;)

Verfasst: Montag 9. März 2009, 21:41
von mocca
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

Verfasst: Montag 9. März 2009, 22:36
von mocca
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

Verfasst: Montag 9. März 2009, 23:09
von derdon

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])