Ich hab
hier für windows etwas passendes gefunden, und versucht das in ctypes nach zu machen
Code: Alles auswählen
from ctypes import *
from ctypes.wintypes import *
LPTSTR = POINTER(c_char)
STD_INPUT_HANDLE = DWORD(-10)
STD_OUTPUT_HANDLE = DWORD(-11)
STD_ERROR_HANDLE = DWORD(-12)
class STARTUPINFO(Structure):
_fields_ = [
("cb", DWORD),
("lpReserved", LPTSTR),
("lpDesktop", LPTSTR),
("lpTitle", LPTSTR),
("dwX", DWORD),
("dwY", DWORD),
("dwXSize", DWORD),
("dwYSize", DWORD),
("dwXCountChars", DWORD),
("dwYCountChars", DWORD),
("dwFillAttribute", DWORD),
("dwFlags", DWORD),
("wShowWindow", WORD),
("cbReserved2", WORD),
("lpReserverd2",LPBYTE),
("hStdInput", HANDLE),
("hStdOutput", HANDLE),
("hStdError", HANDLE),
]
class PROCESS_INFORMATION(Structure):
_fields_ = [
("hProcess", HANDLE),
("hThread", HANDLE),
("dwProcessId", DWORD),
("dwThreadId", DWORD),
]
if __name__ == '__main__':
cmd = b"cmd.exe"
buff_size = DWORD(64)
buff = create_string_buffer(64)
chars = DWORD(0)
si = STARTUPINFO()
pi = PROCESS_INFORMATION()
si.cb = sizeof(si)
#Zero Memory si, pi
proc = windll.kernel32.CreateProcessA(
c_char_p(0),
c_char_p(cmd),
None,
None,
False,
0,
None,
None,
byref(si),
byref(pi),
)
stdin = windll.kernel32.GetStdHandle(STD_INPUT_HANDLE)
stdout = windll.kernel32.GetStdHandle(STD_OUTPUT_HANDLE)
#stderr.
proc_stdin = si.hStdInput
proc_stdout = si.hStdOutput
while not windll.kernel32.ReadConsoleA(stdin, buff, sizeof(buff),
byref(chars), None):
writtenThisTime = DWORD(0)
written = DWORD(0)
while written.value < chars.value:
windll.kernel32.WriteConsoleA(
proc_stdout,
buff+written,
chars-written,
byref(writtenThisTime),
None,
)
written += writtenThisTime
Leider klappt die while Schleife noch nicht so ganz. written bleibt bei mir irgendwie immer 0 und das in der zweiten while Schleife mit buff+written ist ja auch unsinnig.
Kann man mit CreateProcess auch bestimmen, dass das nicht im gleichen Konsolenfenster geöffnet werden soll?