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

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.
Antworten
patrickk
User
Beiträge: 31
Registriert: Donnerstag 18. August 2005, 09:07

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
Clython
User
Beiträge: 151
Registriert: Samstag 21. August 2004, 13:58
Wohnort: Schweiz, BE-2500

Unter welchem Betriebssystem arbeitest du?

Was für Anwendungen sind das?
patrickk
User
Beiträge: 31
Registriert: Donnerstag 18. August 2005, 09:07

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
rogen
User
Beiträge: 85
Registriert: Dienstag 29. März 2005, 17:45
Wohnort: neustift
Kontaktdaten:

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
patrickk
User
Beiträge: 31
Registriert: Donnerstag 18. August 2005, 09:07

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?
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.
Benutzeravatar
jens
Python-Forum Veteran
Beiträge: 8502
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

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!

GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
patrickk
User
Beiträge: 31
Registriert: Donnerstag 18. August 2005, 09:07

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
hehejo
User
Beiträge: 56
Registriert: Freitag 18. Februar 2005, 18:24
Wohnort: Stein
Kontaktdaten:

Code: Alles auswählen

from glob import glob
if len(glob('PFAD/DORT/HIN/*.*)) > 0:
  print 'da ist was drin'
Gruß, Johannes
[b][color=red]ascii stupid question,
get stupid ansii[/color][/b]
[url]http://www.hehejo.de[/url]
Benutzeravatar
jens
Python-Forum Veteran
Beiträge: 8502
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

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!

GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
patrickk
User
Beiträge: 31
Registriert: Donnerstag 18. August 2005, 09:07

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
Benutzeravatar
jens
Python-Forum Veteran
Beiträge: 8502
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

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!!!

GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
Antworten