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.
BlackJack

Beitragvon BlackJack » Montag 9. März 2009, 21:35

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

Beitragvon cofi » Montag 9. März 2009, 21:39

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

Beitragvon mocca » Montag 9. März 2009, 21:41

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

Beitragvon mocca » Montag 9. März 2009, 22:36

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

Beitragvon derdon » Montag 9. März 2009, 23:09

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

Beitragvon BlackJack » Montag 9. März 2009, 23:22

@mocca: Ja klar, `subprocess.call()` und `__import__()` sind beides Aliase für ``exec``. :roll:

Nein, Du musst schon die Doku lesen und verstehen was die Funktionen machen und nicht einfach nur wild herum probieren. Dazu müsstest Du wohl einfach mal anfangen Python zu lernen. Was Namen sind. Das man Objekte an Namen binden kann. Das Module auch Objekte sind. Und so weiter…
mocca
User
Beiträge: 84
Registriert: Mittwoch 4. März 2009, 16:44

Beitragvon mocca » Dienstag 10. März 2009, 00:14

oh je :(

das kann ich mir zeitlich aktuell nicht leisten.
ich lese mich ja nach und nach rein und lerne durch andere skripte und eigene experimente aber ich kann nicht zusätzlich noch komplett python lernen. das geht nicht mal eben über nacht :(

ich will nicht faul erscheinen, weit gefehlt, ich versuch nur dieses eine problem zu lösen, der rest steht ja.
so viel uni und dazu die arbeit an den ganzen projekten plus die eigenen plugins.

es ist so frustrierend, wenn man ein programm komplett fertig hat und es läuft, aber es einfach nicht möglich ist es von einem anderen plugin aus aufzurufen.

ich hab nun bestimmt 2 tage damit verbracht das zum laufen zu kriegen.

gibt es keine möglichkeit das skript einfach aufzurfuen, ohne irgendwas zu überwachen, zu verfolgen oder sonstwas?

kann ja nicht sein, dass ein skript läuft, wenn ich per telnet ./testskript.py eingebe und es nicht funktioniert, wenn ich es dann ferngesteuert öffnen will :(

ich kanns auch aus einem shell skript öffnen, aber wenn ich das shell skript von einem python skript öffnen lasse läufts wieder nicht.

ich krieg die krise :(

edit: und ich muss gestehen, wenn mir jemand nen aufruf ohne konkretes beispiel sagt und ich mir dann sowas durchlese http://pydoc.org/2.4.1/subprocess.html , dann bin ich doch überfordert.
gib mir 5 konkrete beispiele und ich leite es mir ab. gib mir ne reine anweisung und ich brauch ewig.



sorry, wichtig. mir ist was eingefallen. wenn ich die konsole schliesse, dann wird auch das programm beendet.
eventuell muss ich also garnicht den befehl abgeben und nix wie weg, sondern dranbleiben....

os.system oder execvp, überwachen die, was sie ausgeführt haben oder führen die aus und fertig?

wenn wir uns das also mit einem offenen telnet-fenster vergleichen:
a) wir geben einen befehl ein und lassen das fenster offen (und schauen den ganzen echo's zu)
b) wir geben einen befehl ein und schliessen das fenster

was wären dann os.system und execvp?
und habt ihr ein beispiel für b) das ich mal probieren könnte?

sorry, aber ich hoffe ihr versteht worauf ich hinauswill.

hab an was in der richtung von trace oder pdb gedacht, aber die warten auf eingaben bzw. ich glaub da bin ich falsch.
BlackJack

Beitragvon BlackJack » Dienstag 10. März 2009, 08:40

@mocca: In der Doku die Du da verlinkst *sind* ein Haufen (>5) konkrete Beispiele!

Wobei die Formatierung nicht so schön ist, da würde ich eher auf die offizielle Dokumentation zurückgreifen: http://docs.python.org/library/subprocess.html

`os.system()` reicht das übergebene Argument an eine Subshell weiter und wartet auf deren Rückgabecode.

`os.exec*()` ersetzt den aktuellen Prozess mit einem neuen.

Das sollte aber auch alles in der Doku stehen.

Aber ich habe Dein Problem immer noch nicht verstanden, bzw. scheinst Du hier mehrere durcheinander zu werfen, denn ``exec`` hat wie gesagt überhaupt nichts damit zu tun. Und das sollte man unabhängig davon ob es nun funktioniert oder nicht, durch etwas anderes ersetzen, wenn das möglich ist.
mocca
User
Beiträge: 84
Registriert: Mittwoch 4. März 2009, 16:44

Beitragvon mocca » Mittwoch 11. März 2009, 03:41

ja, sind mehrere probleme. im prinzip ist es work in progress und wenn ich einen fix oder eine umgehungslösung für das eine problem gefunden habe, suche ich nach der lösung fürs nächste :D

wieder was neues: ist es möglich bilder in ein python skript zu integrieren im sinne von in dem skript selbst zu speichern statt in einer externen datei?
sind 5kb grosse pngs. würd die eigentlich gerne einbetten, damit die nicht verloren gehen o.ä. sonst gibts nen crash.
Benutzeravatar
Hyperion
Moderator
Beiträge: 7472
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

Beitragvon Hyperion » Mittwoch 11. März 2009, 08:31

mocca hat geschrieben:wieder was neues: ist es möglich bilder in ein python skript zu integrieren im sinne von in dem skript selbst zu speichern statt in einer externen datei?
sind 5kb grosse pngs. würd die eigentlich gerne einbetten, damit die nicht verloren gehen o.ä. sonst gibts nen crash.

Bilder sind - wie alle anderen Daten auch - prinzipiell einfach nur eine Anhäufung von Bytes, die durch entsprechende Interpretation zu "Bildern" visualisiert werden können. Also kannst Du diese Bytes ja auch direkt in eine Python-Datenstruktur speichern, etwa in Bytestrings oder Listen.

Die Frage ist nur: Wozu sollte das gut sein? Code und Daten zu trennen ist eigentlich ein fast immer gültiges und gutes Konzept! Was, wenn man mal die Bilder auswechseln möchte? Customizing wird hierdurch sehr erschwert! Die Quellcodedateien wachsen - auch bei "nur" 5KB Bildern - doch stark an und werden unübersichtlich. Ggf. verliert man sogar als Maintainer irgend wann einmal den Überblick über seine Projektstruktur. Man kann doch an so vielen guten Projekten erkennen, dass sich eine durchdachte Verzeichnisstruktur sofort rentiert.
Benutzeravatar
ms4py
User
Beiträge: 1178
Registriert: Montag 19. Januar 2009, 09:37

Beitragvon ms4py » Mittwoch 11. März 2009, 09:41

Um das Konsolenfenster nach dem Aufruf zu schließen, kannst du einfach "pythonw" verwenden.
Ist natürlich nur sinnvoll, wenn du keine Usereingaben verarbeiten musst oder eine GUI hast.

Code: Alles auswählen

import subprocess
sub = subprocess.Popen(["C:\Python26\pythonw","test2.py"], cwd="skripte")
#um auf das Ende zu warten, folgende Zeile Kommentar entfernen:
#sub.wait()

Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder