schleife os.system() & filesize als Restriktion

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
Stoli
User
Beiträge: 17
Registriert: Donnerstag 24. Oktober 2013, 21:02

Hallo zusammen,

ich habe ein kleines Problem eine Schleife zu bauen um eine python-Datei bei einem gewissen Quotienten zu starten:

Code: Alles auswählen

size1 = os.path.getsize('test.txt')

os.system('python loop.py')

size2 = os.path.getsize('test.txt')
test.txt ist eine Art Output-Datei, die einfach überschrieben wird nach loop.py. Der Quotient size2/size1 geht gegen 1, ich will jetzt also loop.py so oft ausführen bis size2/size1 = 1.1 unterschreitet und dann abbrechen.

Ich hätte das mit einer for - if Schleife mit "break" programmiert. Ist das überhaupt möglich und wie sollte ich das machen?

Danke für eure Hilfe!
Viele Grüße
stoli
BlackJack

@Stoli: Das würde man mit einer ”Endlosschleife” mit ``while True:`` machen an deren Ende die Bedingung getestet wird und gegebenfalls dann mit ``break`` abgebrochen wird.

Gibt es einen Grund warum aus Python heraus ein Python-Programm aufgerufen wird, statt das so zu schreiben das man es importieren und die Funktionalität im *selben* Prozess verwenden kann?
Stoli
User
Beiträge: 17
Registriert: Donnerstag 24. Oktober 2013, 21:02

Okay ich werde versuchen einen passenden Code zu generieren mit der Endlosschleife. Ich möchte die Prozesse gerne trennen, denn im "loop.py" wird mittels vieler Schritte (knapp 200-Zeiliger Code) eine Input-Datei erzeugt, die aus einer vorherigen Ergebnisdatei errechnet wurde.

EDIT:

Ich habe es dank deiner Hilfe geschafft die Endlosschleife in meinen Code einzubauen :) Danke!

Ein Problem habe ich noch:

Code: Alles auswählen

while True:
       os.system('Programm Inputdatei') # daraus resultiert eine Datei (nennen wir sie X), die verarbeitet wird:
       
       ....200 zeiliger Code # daraus resultiert die neue Inputdatei, mit selbem Namen
       
       if size2/size1 < 1.1: # Vergleicht Ausgabedatei vor und nach dem 200 zeiligem Code
                 break

Das Problem ist, dass das ausgeführte Programm in der Schleife nicht wirklich geschlossen wird - vermute ich. Normalerweise wird nämlich die Datei X überschrieben, wenn das Programm mit DOS ausgeführt wird. Ist das Programm allerdings geöffnet (unabhängig von dem Python-Programm) werden die Ergebnisse an die Datei X angefügt und die Datei wächst in der Größe. Genau das geschieht auch in der oberen Schleife.

Ist das verständlich? ..
Gibts dafür eine Lösung? Liegt dies an Pyton oder an dem Programm selbst?

Gruß
Stoli
Sirius3
User
Beiträge: 17741
Registriert: Sonntag 21. Oktober 2012, 17:20

@Stoli: es sieht jetzt so aus, als ob Du in die while-Schleife den Code von loop.py hineinkopiert hast.
Das erhöht natürlich die Komplexität. Wenn Du aber loop.py so umschreibst, dass es als Modul eingebunden werden kann und eine Funktion bereit stellt, die das selbe macht, wie vorher der Aufruf von loop.py über die Shell, dann ändert sich an der while-Schleife nicht viel: aus dem os.system wird ein loop.do_something.
BlackJack

@Stoli: Ob die Datei geschlossen wird hängt doch davon ab ob *Du* die schliesst. Wenn Du das nicht machst wird sie natürlich auch nicht geschlossen. Und wenn Du die in ``loop.py`` darauf verlassen hast das die Datei beim Programmende automatisch geschlossen wird, ist das schlicht unsauber programmiert. Die ``with``-Anweisung hilft dabei das eine Datei auf jeden Fall beim verlassen des ``with``-Blocks geschlossen wird.

Falls der Code in der ``loop.py`` aus 200 Code linearem Quelltext besteht, ist das IMHO ein Code-Smell. So lang sollte kein normaler Code am Stück sein.
Stoli
User
Beiträge: 17
Registriert: Donnerstag 24. Oktober 2013, 21:02

@ BlackJack, davon bin ich tatsächlich ausgegangen, dass das Programm geschlossen wird.

Der Code ist tatsächlich linear, 200 Zeilen inklusive Kommentare etc, womöglich deswegen wird sich das wohl auf ca. 100 Zeilen kürzen lassen. Ich bin mir ziemlich sicher, dass der Code an sich auch nicht sauber programmiert wurde - ich bin kein gelernter Programmierer, sondern nur Maschinenbauingenieur. Der Code tut das, was ich möchte und das ist für meine Zwecke momentan ausreichend.

Leider kann ich den Code aus gewissen gründen nicht komplett posten.

@Sirius3
Tatsächlich habe ich im Prinzip das loop.py in den neuen Code hineinkopiert, das erhöht die Komplexität, reduziert das alles aber au eine Python-Datei, was doch besser ist :).


EDIT: ich konnte das ding zum Laufen bekommen, das Problem lag daran, dass eine Text-Datei nicht richtig geschlossen wurde :)
Antworten