[python] presmerovat VSETOK vstup a vystup v pythone

Filip Štědronský regnarg na seznam.cz
Sobota Červen 7 10:22:26 CEST 2008


On Pá, čen 06, 2008 at 11:48:31 +0200, Tomy Novella wrote:
> ahoj,
> robim si xmpp botika ktory funguje asi takto:
> napisem mu nejaky prikaz, ten vykona pomocou os.popen() a vystup mi
> vypise; proste je tu povedzme, ze funckia, ktora prijme vyextrahovany
> vstupa vrati mi peklne vystup. spustam to z konzoly
> problem vsak nastane, ked zadam "specialny" typ prikazov, napr, ked
> zadam "kill blbost",
>  tak mi vypise "kill: 1: Illegal number: blbost" DO KONZOLY a nikde
> inde. detto, ked napisem sudo prikaz, tak mi pyta heslo V KONZOLE a
> nepresmeruje tuto ziadost hesla ku mne...
> vsimol som si, ze rovnakym neduhom trpi aj netcat. kde je problem? da
> sa nejak vyriesit?

V případě chybových hlášení jako v první ukázce bude
problém patrně v tom, že jsou vypisována na STDERR a Vy
přesměrováváte jen STDOUT. Navíc popen funkce jsou
zastaralé — doporučuji použít modul subprocess. Pro
získání všeho výstupu stačí:

from subprocess import *
p=subprocess.Popen("kill blbost", shell=True,
                   stdout=PIPE, stderr=STDOUT)
outp=p.stdout.read()

V případě příkazů jako su(do) je téměř nemožné jim vnutit
nějaký výstup, protože si pečlivě hlídají, jestli jsou
ovládány z konzole, v takovém případě je třeba vytvořit
pty (pseudoterminál), podobně, jako to dělají grafické
emulátory terminálu, jehož jeden konec se připojí k STDIO
ovládané aplikace a s druhým se manipuluje. Přesný postup
Vám neprozradím, ještě se mi to nikdy úspěšně nepovedlo.

S pozdravem regnarg

-- 
regnarg --- http://rg.pretel.cz -- JID: regnarg na jabber.cz
V péči o štěstí druhých nacházíme své vlastní.   --Platón
Přátelství může trvat jedině mezi dobrými lidmi. --Cicero



Další informace o konferenci Python