Sida 1 av 1

Pipening (pipes) i Python

Postat: 10 jul 2007, 13:06
av Victor
Hejsan allihopa :)

I dagens läge kan jag använda modulen optparse för att kunna sätta flaggor på mitt script. Det kan se ut såhär:

Kod: Markera allt

python script.py -i infil.txt -o utfil.txt 
och funkar jättebra.

Men nu surfade jag runt och hittade ett annat ord som lät intresant: "Pipes in python", dock förklarar ingen hur jag ska gå tillväga för att nå det slutresultat som jag vill uppnå som kan se ut såhär ungefär:

Kod: Markera allt

infil.txt | script.py > utfil.txt
och eventuellt kunna sätta flaggor på script.py.

Hur ska jag skriva i koden för att kunna uppnå det här med "pipening"?

/Victor

SV: Pipening (pipes) i Python

Postat: 10 jul 2007, 13:11
av Okänd
Det du nog vill göra är nåt i stil med

Kod: Markera allt

cat infil.txt | script.py > utfil.txt
Det som händer då är att ditt shell kommer att koppla STDIN i ditt python script till outputen från cat, så att när cat skriver till STDOUT så kommer det att komma på STDIN i script.py.

SV: Pipening (pipes) i Python

Postat: 11 jul 2007, 13:23
av Victor
Okej, ja det ska väl inte vara allt för svårt.. :)

SV: Pipening (pipes) i Python

Postat: 11 jul 2007, 15:57
av Victor
det funkar bra nu :)

Nu till den frågan jag väntat på, om jag vill spara min output som en bild-fil?

Kod: Markera allt

infil.txt | script.py > bild.jpg
går det ens?

SV: Pipening (pipes) i Python

Postat: 11 jul 2007, 16:06
av Okänd
ja, det borde gå om ditt program skriver ut en bild på STDOUT

SV: Pipening (pipes) i Python

Postat: 11 jul 2007, 16:32
av Victor
Jaadu, hur kan man göra det? Jag sparar ju bilden genom:

Kod: Markera allt

im.save('bild.jpg', 'JPEG', quality = 95)
men det känns ganska säkert att det inte funkar med:

Kod: Markera allt

sys.stdout(im.save('bild.jpg', 'JPEG', quality = 95))

SV: Pipening (pipes) i Python

Postat: 11 jul 2007, 16:39
av Okänd
sys.stdout(im.save('bild.jpg', 'JPEG', quality = 95)) kommer nog inte att fungera eftersom den returnerar nog bara status på hur det gick att spara bilden. Men jag förstår inte varför du vill använda pipes?

Varför tar du inte bara in filnamnet som ett argument istället typ

cat infil.txt | script.py -o bild-namn.jpg

Sedan använder sparar du bara filen med im.save() och argumentet bild-namn.jpg

http://www.artima.com/weblogs/viewpost.jsp?thread=4829

SV: Pipening (pipes) i Python

Postat: 11 jul 2007, 16:46
av Victor
Precis det du säger nu är det jag har i åtanke att göra om det inte skulle funkar eller om det skulle bli för krångligt att göra med pipes.

Tack så mycket då! Jag kör med en flagga istället..

SV: Pipening (pipes) i Python

Postat: 11 jul 2007, 16:51
av Okänd
okey, well om du vill göra det hela med att > fil.jpg (detta kallas för övrigt redirection inte pipening) att pipe'a är nåt man gör mellan processer.

Det som händer då är att shellet kopplar om stdout så att istället för att skriva det till konsolen så kommer det att skrivas till filen som man specificerade.

För att du ska kunna göra detta så måste du isf få ut en raw byte-ström från filen och sedan bara skriva ut den på STDOUT, jag programmer inte i python och har ingen aning om vilket biliotek du använder så jag har ingen aning om hur du ska göra det, men det du bör tänkta på är att om man inte specificerar någon fil så kommer skiten att skrivas ut i terminalen.

SV: Pipening (pipes) i Python

Postat: 13 jul 2007, 15:48
av Victor
Detta har lite att göra med pipes/stdin men jag frågar ändå i denna tråd.

Om jag vill kunna ta emot ytterligare input från användaren hur gör jag då?. raw_input() verkar inte vara en bra idé då den utnyttjar stdin och ger ett felmedelande när programmet redan körs med ett stdin (pipen).

SV: Pipening (pipes) i Python

Postat: 13 jul 2007, 15:55
av Okänd
Om du länkar STDIN till en pipe så kommer du inte att kunna läsa in data från användaren genom konsolen / terminalen.

Det du kan göra istället är att använda flaggor som specificerar in-filer och ut-filer

tex. ./script.py -i infile -o outfile
Då kommer du ha både STDOUT & STDIN kvar att ge användaren feedback samt få indata från användaren genom konsolen / terminal. Sedan internt i ditt program så kommer du då att ha 4 st "strömmar" eller vad det kallas för i python, om du vill skriva till outfile så skriver du bara till den strömmen, om du vill skriva till användarens konsol / terminal så skriver du till strömmen.

SV: Pipening (pipes) i Python

Postat: 13 jul 2007, 16:06
av Victor
Okej.. Jo det det har jag också, men om jag måste fråga användaren något? Tex "Du håller just nu på att skriva över en befintlig fil, vill du fortsätta? (j/n)"

Eller det kanske är bättre att ha en flagga istället som säger åt den att skriva över automatisk, och inte skriva över som standard?

SV: Pipening (pipes) i Python

Postat: 13 jul 2007, 19:25
av Okänd
låter vettigt, typ en force flagga som skriver över filer, får man fråga vad det är för program du skriver?

SV: Pipening (pipes) i Python

Postat: 14 jul 2007, 13:18
av Victor
Jaadu, det kan du väl få göra :)

Det är så att jag sommarjobbar på ericsson, på testlabbet. Jag skriver ett program som ska göra en bakgrund till ett annat program som simulerar diverse saker (ska jag vara helt ärlig så vet jag faktiskt inte hur mkt jag får säga, men jag försöker att inte säga för mkt :P). Jag har fått en fil med koordinater där alla master är utsatta, tror det bara är sverige/norden, och de ska komma in i mitt progra genom en pipe. I programmet ska jag behandla uppgifterna och måla upp alla celler (cirklar) som det kallas.

Det är väl på det hela vad jag håller på med. Jag kan också tillägga att jag har aldrig programmerat Python innan så det har blivit en utmaning. Men det har varit kul på vägen och jag har lärt mig jättemkt, många gånger pga er ;). Jag slutar nästa fredag så jag har nästa vecka på mig att förfina det jag gjort och just nu, eller förra veckan har jag suttit och hållt på med "front-endet" som visserligen bara är terminalbaserat men det ska vara solid/funka utan problem.

:)