Seite 1 von 1

2 Skripte laufen, es soll nur ein programm gestartet werden.

Verfasst: Montag 5. September 2005, 13:36
von patrickk
Hallo,

ich habe zwei Skripte, die einen Befehl ausfuehren:
os.system(Befehl)

Wie kann ich dafuer sorgen, dass nur ein Skript den befehl ausfuehrt. Also Befehl solange geblocked ist, bis skript1 fertig ist. Und dann kann skript2 senden...
mit thread, semaphoren...?
Oder kann ich pruefen, dass deiser thread gerade ausgefuehrt wird und solange warte bis er nicht mehr ausgefuehrt wird?
Wie geht das?


Danke fuer Tipps,


Patrick

Verfasst: Montag 5. September 2005, 14:32
von Clython
Unter welchem Betriebssystem arbeitest du?

Was für Anwendungen sind das?

linux

Verfasst: Montag 5. September 2005, 15:34
von patrickk
hallo,

ich verwende linux. die datei, die ich ausfuehre ist unter linux... das geht mit os.system(/home/.../Datei). ..
Die anwendungen starten beide den selben Befehl. Ich haette nur gerne als Sicherheit eingebaut, dass Anwendung B solange wartet bis sie den Befehlt ausfuehrt, wie A ihn verwendet und andersrum...

Patrick

mit sockets

Verfasst: Montag 5. September 2005, 15:43
von rogen
im forum wurde einmal eine möglichkeit besprochen wie
man kontrollieren kann ob ein programm läuft

müsste mit deinen programm auch gehen.

http://www.python-forum.de/viewtopic.ph ... mm+l%E4uft

hmm

Verfasst: Montag 5. September 2005, 16:26
von patrickk
kann man es auch mit threads machen?

So sieht ein Modul aus:

Code: Alles auswählen

class DeliveryServer:

  def NEWMSG(self, params):

  ..............


def start(sleeptime,lock):

  port = 8888
  server = SimpleXMLRPCServer.SimpleXMLRPCServer(("", port))

  server.register_instance(DeliveryServer())^server.serve_forever()
Ich habe eine def start... gemacht um das Modul als thread starten zu koennen.

Anderes Modul, dass dieses als neuen thread started:

Code: Alles auswählen

import sys
import thread
sys.path.insert(0,"/home/test/")
import LCDeliveryXMLRPCReceiver


lock=thread.allocate_lock()
thread.start_new_thread(LCDeliveryXMLRPCReceiver.start,(2,lock))
in der class oben verwende ich dann:

Code: Alles auswählen

lock.acquire() 
und release...
wenn ich mein skript starte sehe ich aber nichts. Weiss einer worna das liegt?
oder kann man die ausgaben nicht sehen bei thread=start_new... was kann man da machen?


Patrick

Edit (Leonidas): Code in Python-Tags gesetzt. Die meiste Zeit sitze ich im Forum rum, um aus Code-Tags Python-Tags zu machen oder überhaupt Code in irgendwelche Tags zu setzen. Warum liest denn keiner die "Vor dem Posten lesen" Threads? :evil: patrickk, könntest du das nächste mal darauf achten, dass die deinen Quellcode in die entsprechenden Tags setzt?

Re: hmm

Verfasst: Montag 5. September 2005, 23:16
von BlackJack
Könntest Du Deine Codebeispiele bitte in (python)-Tags packen. Ohne die Einrückung ist es schwer lesbar und kann bei etwas komplexeren Quelltexten schnell zum Ratespiel werden.
patrickk hat geschrieben:wenn ich mein skript starte sehe ich aber nichts. Weiss einer worna das liegt?
Du hast Die Augen geschlossen? :wink:

Mal ernsthaft: Welche Ausgaben bitteschön? In Deinem Code-Schnipsel waren keine Ausgaben. Grundsätzlich kann man auch in Threads ``print`` Anweisungen benutzen.

Aber ich weiss nicht so recht ob Threads überhaupt Dein Problem lösen. Ich dachte Du willst das Skript selbst mehrmals starten und nicht mehrere Threads innerhalb des selben Skripts!?

Falls es doch mehrere Threads in einem Skript sind, die ein bestimmtes externes Programm nicht mehrmals zur gleichen Zeit starten sollen, dann würde ich einen extra Thread empfehlen, der über eine Queue Aufträge zum starten von den anderen entgegennimmt. Dann solltest Du aber das `threading` Modul benutzen, das ist etwas komfortabler und bietet etwas ausgefeiltere Sperrmethoden.

Verfasst: Dienstag 6. September 2005, 06:09
von jens
Ich hab es so verstanden, das sein Programm nicht mehrmals gestartet werden soll... Da aber ein Server auf Port 8888 gestartet wird, kann eh nicht's passieren, denn beim zweiten Aufruf ist dieser Port ja vom ersten belegt...
Beim socket erstellen noch ein try-except einbauen und dann eine Meldung ausgeben, das der Server schon läuft...

@Leonidas: Das keiner die python-Tags benutzt wird daran liegen, das im default-Boardstyle, die Buttons nicht da sind!

Verfasst: Dienstag 6. September 2005, 08:27
von patrickk
Hallo,

danke fuer die Hilfe. In der Klasse wird die Datei aufgerufen, die nicht zweimal gestartet werden soll. Dort sind auch print ausgaben... aber sehen tue ich so nichts. Auch wenn ich einen Fehler mache wird dies nicht angezeigt, sondern er bricht ab und wartet auf eine neue Message... server.serve forever...
Ich habe noch ein anderes python Modul (nicht port8888), der das selbe programm aufruft. Hier dachte ich koennte ich ein neues Skript erstellen, dass das simplexmlserver modul als thread started und das andere als anderen thread startet und dann mit

Code: Alles auswählen

thread.start_new_thread(LCDeliveryXMLRPCReceiver.start,(2,lock)) 
#starten der beiden versch. threads. hier nur einer
#in Modul:
    lock.acquire()
    sendXML.sendXML(title,link,curtime)
    #dort ist das programm enthalten dass nicht gleichzeitet zwei dinge schicken soll
    lock.release()
[/b][/size]

Es kann in diesem Fall aber auch einfacher gehen. Gibt es einen Befehl um zu schauen, ob eine Datei in einem Ordner ist? Das muss fuer das Tool angelegt werden. Solange koennte ich das Skript ja ganz einfach blockieren und es passiert nichts...
Trotzdem waere ich dankbar wenn mir jmd sagen koennte warum ich in dem server tool keine Ausgaben bekomme. Wenn statt def die Zeilen unten so stehen, dass man das Skript direkt startet sehe ich anzeigen. Aber Fehlermeldungen bekomme ich nie angezeigt. Woran liegt das? Sorry, habe noch nicht viel mit Klassen gemacht..
Und ab jetzt gibt es den Code in den tags...

Code: Alles auswählen


if os.path.isfile('/home/name/Send/*'):
#das geht leider nicht. Wie kann ich schauen, ob da egal was fuer eine Datei in dem Ordner ist?

[/b]
Patrick

Mit glob.glob

Verfasst: Dienstag 6. September 2005, 10:48
von hehejo

Code: Alles auswählen

from glob import glob
if len(glob('PFAD/DORT/HIN/*.*)) > 0:
  print 'da ist was drin'

Verfasst: Dienstag 6. September 2005, 10:51
von jens
patrickk hat geschrieben:Gibt es einen Befehl um zu schauen, ob eine Datei in einem Ordner ist?
Das war doch eine Lösung in dem Thread, den rogen dir schon gezeigt hatte:
http://www.python-forum.de/viewtopic.php?p=9599#9599

Mit glob würde ich da nicht arbeiten!

hi

Verfasst: Dienstag 6. September 2005, 11:02
von patrickk
hi, danke fuer die Hinweise.
Ich lege nur Dateien in einen Tmp Ordner. Der Ordner muss bestehen bleiben.

Hab es jetzt so gemacht:

Code: Alles auswählen

import os
import time
tmp = os.listdir('/home/name/Send/')
while tmp !=[]:
	time.sleep(2)
	tmp = os.listdir('/home/name/Send/')
Wenn noch jmd etwas zu den Problemen mit der Klasse weiss?

Patrick

Re: hi

Verfasst: Dienstag 6. September 2005, 12:02
von jens
patrickk hat geschrieben:Ich lege nur Dateien in einen Tmp Ordner.
Schau dir dazu das Modul http://www.python.org/doc/current/lib/m ... pfile.html an!!!