#!/usr/bin/env python
import sys
# use stdin if it's full
if not sys.stdin.isatty():
input_stream = sys.stdin
# otherwise, read the given filename
else:
try:
input_filename = sys.argv[1]
except IndexError:
message = 'need filename as first argument if stdin is not full'
raise IndexError(message)
else:
input_stream = open(input_filename, 'rU')
for line in input_stream:
print(line) # do something useful with each line
由于这个答案在搜索piping data to a python script时会出现在Google的顶部,我想添加另一个方法,我在[J. Beazley's Python Cookbook][1]中找到了这个方法,我搜索了一个比使用sys更简单的方法。
import fileinput
with fileinput.input() as f_input:
for line in f_input:
print(line, end='')
此方法也适用于结构如下的命令:
$ ls | ./filein.py # Prints a directory listing to stdout.
$ ./filein.py /etc/passwd # Reads /etc/passwd to stdout.
$ ./filein.py < /etc/passwd # Reads /etc/passwd to stdout.
7条答案
按热度按时间ymzxtsji1#
您需要从stdin中读取以检索python脚本中的数据,例如:
如果您想在这里做的只是从mysql数据库中获取一些数据,然后使用Python对其进行操作,我会跳过将其导入脚本的过程,而只使用the Python MySql module来执行SQL查询。
k5hmc34c2#
如果您希望您的脚本像许多Unix命令行工具一样工作,并接受管道或文件名作为第一个参数,您可以使用以下命令:
093gszye3#
当你通过管道将一个命令的输出传递给pytho脚本时,它会转到sys.stdin。你可以像读取文件一样读取sys.stdin。例如:
这个程序直接输出它的输入。
bn31dyow4#
由于这个答案在搜索
piping data to a python script
时会出现在Google的顶部,我想添加另一个方法,我在[J. Beazley's Python Cookbook][1]中找到了这个方法,我搜索了一个比使用sys
更简单的方法。此方法也适用于结构如下的命令:
如果你需要更复杂的解,你可以把
argparse
和fileinput
组合起来[如martinth的要点所示][2]:第一次
xpcnnkqh5#
可以使用命令行工具
xargs
echo 'arg1' | xargs python script.py
现在可以从
script.py
中的sys.argv[1]
访问arg1
kcugc4gi6#
同样适用于Windows和
Python 3.10.3
的 * 一行程序 * 使用sys.stdin.read()
,如下所示:zlhcx6iw7#
我在尝试将一个bash命令传输到一个我没有编写的python脚本(也不想修改以接受
sys.stdin
)时偶然发现了这个问题。例如
some_script.py -arg1 <(bash command)