Seite 1 von 1

Problem: Text in Konsole schreiben (Windows)

Verfasst: Montag 29. Mai 2006, 08:23
von Roman
Hallo,

Ich habe ein Programm geschrieben, was das freezen von Programmen mit py2exe erleichtern soll.
Ist auch soweit schon alles fertig, nur soll an einer Stelle "C:\\programme\\py2exe_einfach\\compile.py py2exe" in die Konsole geschrieben werden.
Mit os.popen() scheint es zwar irgendwie zu funktionieren, aber es kommt nichs im dist Ordner an...
Wenn ich ein print vor os.popen() setze, kommt folgende Meldung:

Code: Alles auswählen

<open file 'C:\programme\py2exe_einfach\compile.py py2exe', mode 'r' at 0x00A10140>
Das heisst, dass irgendwie eine Verbindung aufgebaut wird... Aber warum kommt die fertige .exe nicht im dist Ordner an? :?

Danke,
Roman

PS: Vielleicht ist der Beitrag jetzt im falschen Forum?
Wenn ja, bitte verschieben... :wink:

Verfasst: Montag 29. Mai 2006, 16:56
von Leonidas
Ähm, wenn du in eine Datei schreiben willst nutzt man file(). Ich weiß jetzt gar nicht warum du da irgendwas mit popen versuchst...

Verfasst: Montag 29. Mai 2006, 23:17
von Roman
Oh, Sorry... Ich habe mich wahrscheinlich etwas unklar ausgedrueckt. :oops:
Ich moechte den Text in die Windows-Konsole schreiben.
Und da benutzt man doch normalerweise os.popen(), oder?
Danke,
Roman

Verfasst: Dienstag 30. Mai 2006, 10:10
von Joghurt
Nein, dafür benutzt man in der Regel print (oder sys.stdout.write)

Verfasst: Dienstag 30. Mai 2006, 11:41
von Roman
Aber print schreibt meinen Befehl doch einfach nur in das Programm - Fenster...
Ich möchte es aber in die Eingabeaufforderung (cmd) schreiben.
(Dachte, das wäre das selbe wie Konsole... :oops: )

MfG,
Roman

Verfasst: Dienstag 30. Mai 2006, 11:46
von Joghurt
Du willst also ein Programm aufrufen.
Dann suchst du os.system

Wenn dich die Ausgabe des Programmes interessiert (was es schreibt), musst du tatsächlich mit popen arbeiten, allerdings musst du dann auch mit read/readline auslesen ;)

Verfasst: Dienstag 30. Mai 2006, 11:55
von Roman
Genau den Befehl habe ich gesucht! Danke! :D

Gibt es jetzt noch eine Möglichkeit, das DOS Fenster, was aufgerufen wird, zu verstecken, oder so?
Irgendwie kommt das ein wenig unelegant, wenn in einem GUI Programm auf einmal so eine Konsole auftaucht... :)
Danke,
Roman

Verfasst: Dienstag 30. Mai 2006, 12:16
von pr0stAta
Wenn du eine einfache py Datei ohne console starten willst,
änder einfach die Dateiendung von .py in .pyw.
Falls du eine .exe über py2exe erstellt hast, kannst du einfach
den console Befehl in der setup.py durch window ersetzen.

Verfasst: Dienstag 30. Mai 2006, 12:28
von Roman
Ja, das weiss ich schon...
Das Problem ist nur, wenn ich os.system() anwende, dann wird die Konsole auch aufgerufen, wenn die Datei eine .pyw ist.
Aber letztendlich ist das auch nur ein kleiner Schönheitsfehler mit dem ich auch leben kann :)

Natürlich wäre es trotzdem schön, wenn jemand eine Lösung dafür hätte.

MfG,
Roman

Verfasst: Dienstag 30. Mai 2006, 12:48
von gerold
Roman hat geschrieben:wenn ich os.system() anwende, dann wird die Konsole auch aufgerufen, wenn die Datei eine .pyw ist.
Hi Roman!

Verwende statt os.system() --> os.spawnl().
Hier ein Beispiel:

Code: Alles auswählen

import os

command = 'C:/winnt/notepad.exe'
args = '"C:/testordner/hallowelt.txt"'
os.spawnl(os.P_WAIT, command, command + ' ' + args)
mfg
Gerold
:-)

Verfasst: Freitag 2. Juni 2006, 10:23
von Roman
Hallo Gerold,
Sorry, ich hatte die letzten Tage wenig Zeit, daher habe ich deinen Beitrage erst jetzt gelesen...

Ich möchte die Datei aber nicht "direkt" öffnen, sondern über py2exe.
Also muss der Befehl "C:\\irgendwas\\compile.py py2exe" sein und das gibt bei mir nur Fehlermeldungen, wenn ich es so eingebe...

Code: Alles auswählen

>>> import os
>>> command = "C:\\system32\\cmd.exe"
>>> args = "C:\\programme\\py2exe_einfach\\compile.py py2exe"
>>> os.spawnl(os.P_NOWAIT, command, command + ' ' + args)
Traceback (most recent call last):
  File "<pyshell#26>", line 1, in ?
    os.spawnl(os.P_NOWAIT, command, command + ' ' + args)
  File "C:\Python22\lib\os.py", line 523, in spawnl
    return spawnv(mode, file, args)
OSError: [Errno 2] No such file or directory
(Die Datei existiert und der Pfad ist auch soweit richtig)

Könntest du mir eventuell noch ein Beispiel für so einen Pfad geben?
Danke,
Roman

Verfasst: Freitag 2. Juni 2006, 10:47
von gerold
Hi Roman!

So sollte es funktionieren:

Code: Alles auswählen

import os
command = 'C:/Python24/python.exe'
args = '"C:\\programme\\py2exe_einfach\\compile.py" "py2exe"'
os.spawnl(os.P_WAIT, command, command + ' ' + args)
mfg
Gerold
:-)

Verfasst: Freitag 2. Juni 2006, 12:30
von Roman
Hallo Gerold,
So, jetzt funktioniert es :D
Danke!!!

Was gibt spawnl eigentlich zurück? Da steht bei mir 152. Was sagt mir dieser Wert?

Bis dann,
Roman :)

Verfasst: Freitag 2. Juni 2006, 12:34
von Leonidas
Roman hat geschrieben:Was gibt spawnl eigentlich zurück? Da steht bei mir 152. Was sagt mir dieser Wert?
Dokumentation des OS-Moduls hat geschrieben:this function returns the process ID of the new process
Also sagt dir dieser Wert die PID des Prozesses. Unter Unices könntest du denn damnn mit kill <PID> beenden, oder sonstige Dinge damit machen. Aber das brauchst du wohl eher nicht.

Verfasst: Freitag 2. Juni 2006, 13:02
von gerold
Hi!

Ich habe da noch eine Verbesserung am Code vorgenommen:

Code: Alles auswählen

import os
import sys
command = sys.executable # ='C:/Python24/python.exe'
args = '"C:\\programme\\py2exe_einfach\\compile.py" "py2exe"'
os.spawnl(os.P_WAIT, command, command + ' ' + args)
mfg
Gerold
:-)

Verfasst: Sonntag 4. Juni 2006, 00:38
von Roman
Hallo,
Das mit der Verbesserung ist ja nicht schlecht. Funktioniert dann wohl auch, wenn man Python in ein anderes Verzeichnis installiert hat, oder?

Bei mir gibt executable "pythonw.exe" aus... Woran kann das liegen?
Auch wenns für meine Zwecke im Moment ganz gut ist :D

Code: Alles auswählen

>>> import sys
>>> sys.executable
'C:\\Python22\\pythonw.exe'
Und noch was, auch wenns hier nicht ins Forum passt... Das "

Code: Alles auswählen

" zum Einfügen von Code wird bei immer am Ende des Beitrages eingefügt, sodass ich es immer noch kopieren/einfügen muss. Geht euch das auch so?

Danke für die Mühe,
Roman

Verfasst: Sonntag 4. Juni 2006, 11:13
von Leonidas
Roman hat geschrieben:Bei mir gibt executable "pythonw.exe" aus... Woran kann das liegen?
Dall liegt daran, dass du dein Script nicht mit Python.exe sondern mit Python2.exe startest, welches normalerweise keine Shell-Fenster öffnet (also für GUI Programme nett). Pythonw.exe wird auch hergenommen, wenn du .pyw-Skripte startest.

Verfasst: Sonntag 4. Juni 2006, 11:15
von Leonidas
[quote="Roman"]Und noch was, auch wenns hier nicht ins Forum passt... Das "

Code: Alles auswählen

" zum Einfügen von Code wird bei immer am Ende des Beitrages eingefügt, sodass ich es immer noch kopieren/einfügen muss. Geht euch das auch so?[/quote]
Ich markier immer den Code, klicke dann auf den Python-Button. Das funktioniert bei mir im Firefox, aber ich hab schon gesehen, dass es in anderen Browsern nicht hingehauen hat. Einfach mal ausprobieren.

Verfasst: Donnerstag 8. Juni 2006, 03:19
von Roman
Hallo,
Das mit dem code ist ja auch eigentlich nicht zu schlimm, halt nur n bissel lästig. Aber damit kann man ja fertig werden :D

Danke für die Info über sys.executable...
Bis dann,
Roman

PS: Sorry, dass es so lange gedauert hat mit dem Antworten, aber ich war verreist...