Pipening (pipes) i Python

Här diskuteras programmering och utveckling
Användarvisningsbild
Victor
Inlägg: 425
Blev medlem: 12 okt 2006, 19:08
OS: Ubuntu
Utgåva: 23.10 Mantic Minotaur
Ort: Lund

Pipening (pipes) i Python

Inlägg 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
// So long, and thank you for all the fish

"Your Ubuntu User number is # 10448"
Okänd
Inlägg: 30172
Blev medlem: 03 mar 2008, 01:30
OS: Ubuntu

SV: Pipening (pipes) i Python

Inlägg 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.
Användarvisningsbild
Victor
Inlägg: 425
Blev medlem: 12 okt 2006, 19:08
OS: Ubuntu
Utgåva: 23.10 Mantic Minotaur
Ort: Lund

SV: Pipening (pipes) i Python

Inlägg av Victor »

Okej, ja det ska väl inte vara allt för svårt.. :)
// So long, and thank you for all the fish

"Your Ubuntu User number is # 10448"
Användarvisningsbild
Victor
Inlägg: 425
Blev medlem: 12 okt 2006, 19:08
OS: Ubuntu
Utgåva: 23.10 Mantic Minotaur
Ort: Lund

SV: Pipening (pipes) i Python

Inlägg 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?
// So long, and thank you for all the fish

"Your Ubuntu User number is # 10448"
Okänd
Inlägg: 30172
Blev medlem: 03 mar 2008, 01:30
OS: Ubuntu

SV: Pipening (pipes) i Python

Inlägg av Okänd »

ja, det borde gå om ditt program skriver ut en bild på STDOUT
Användarvisningsbild
Victor
Inlägg: 425
Blev medlem: 12 okt 2006, 19:08
OS: Ubuntu
Utgåva: 23.10 Mantic Minotaur
Ort: Lund

SV: Pipening (pipes) i Python

Inlägg 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))
// So long, and thank you for all the fish

"Your Ubuntu User number is # 10448"
Okänd
Inlägg: 30172
Blev medlem: 03 mar 2008, 01:30
OS: Ubuntu

SV: Pipening (pipes) i Python

Inlägg 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
Användarvisningsbild
Victor
Inlägg: 425
Blev medlem: 12 okt 2006, 19:08
OS: Ubuntu
Utgåva: 23.10 Mantic Minotaur
Ort: Lund

SV: Pipening (pipes) i Python

Inlägg 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..
// So long, and thank you for all the fish

"Your Ubuntu User number is # 10448"
Okänd
Inlägg: 30172
Blev medlem: 03 mar 2008, 01:30
OS: Ubuntu

SV: Pipening (pipes) i Python

Inlägg 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.
Användarvisningsbild
Victor
Inlägg: 425
Blev medlem: 12 okt 2006, 19:08
OS: Ubuntu
Utgåva: 23.10 Mantic Minotaur
Ort: Lund

SV: Pipening (pipes) i Python

Inlägg 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).
// So long, and thank you for all the fish

"Your Ubuntu User number is # 10448"
Okänd
Inlägg: 30172
Blev medlem: 03 mar 2008, 01:30
OS: Ubuntu

SV: Pipening (pipes) i Python

Inlägg 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.
Användarvisningsbild
Victor
Inlägg: 425
Blev medlem: 12 okt 2006, 19:08
OS: Ubuntu
Utgåva: 23.10 Mantic Minotaur
Ort: Lund

SV: Pipening (pipes) i Python

Inlägg 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?
// So long, and thank you for all the fish

"Your Ubuntu User number is # 10448"
Okänd
Inlägg: 30172
Blev medlem: 03 mar 2008, 01:30
OS: Ubuntu

SV: Pipening (pipes) i Python

Inlägg 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?
Användarvisningsbild
Victor
Inlägg: 425
Blev medlem: 12 okt 2006, 19:08
OS: Ubuntu
Utgåva: 23.10 Mantic Minotaur
Ort: Lund

SV: Pipening (pipes) i Python

Inlägg 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.

:)
// So long, and thank you for all the fish

"Your Ubuntu User number is # 10448"
Skriv svar

Återgå till "Programmering och webbdesign"