-
-
Save fyears/4161739 to your computer and use it in GitHub Desktop.
#!/usr/bin/env python | |
# -*- coding: utf-8 -*- | |
''' | |
usage: | |
cat about.txt | python soinput.py | |
''' | |
import sys | |
def read_in(): | |
lines = sys.stdin.readlines() | |
for i in range(len(lines)): | |
lines[i] = lines[i].replace('\n','') | |
#print lines | |
return lines | |
def main(): | |
lines = read_in() | |
print lines | |
if __name__ == '__main__': | |
main() |
analogpixel
commented
Jun 28, 2016
Concrete example where data flows into script using stdin from some previous program (another script). Line by line explanations for code below can be found here
# stdin.py
sys.stdout = fsock
print("15\n"
"A\n"
"B\n"
"C\n"
"D\n"
"E\n"
"F\n"
"G\n"
"H")
sys.stdout = saveout
fsock.close()
# stdin.py
def read_in():
return {x.strip() for x in sys.stdin}
def main():
lines = read_in()
for line in lines:
print(line)
if __name__ == '__main__':
main()
In the console, run this to see above working. Why this works is also explained here
>>>Python3.5 stdout.py
>>>cat out.log | Python3.5 stdin.py
If you use a set ( { ... }
) for the reading of lines, you won't necessarily get them back in the same order, though, right?
return {x.strip() for x in sys.stdin}
You probably want to be using a list comprehension instead, so the read input will stay in the order of having been read:
return [x.strip() for x in sys.stdin]
Thanks for the gist! I've used it to set up an alias to urlencode strings like so, maybe this is helpful to someone:
python3 -c 'import sys; from urllib.parse import quote; print(quote(sys.stdin.readlines()[0]))'
Most likely you don't want to remove all whitespace from the line, only the trailing newline
def read_in():
return [x.rstrip('\n') for x in sys.stdin ]