我想运行mysql
命令并将其输出设置为我的python脚本中的变量。
这是我正在尝试运行的shell命令:
$ mysql my_database --html -e "select * from limbs" | ./script.py
这是python脚本:
#!/usr/bin/env python
import sys
def hello(variable):
print variable
我如何接受python脚本中的变量并让它打印输出?
答案 0 :(得分:25)
您需要从stdin读取以检索python脚本中的数据,例如
#!/usr/bin/env python
import sys
def hello(variable):
print variable
data = sys.stdin.read()
hello(data)
如果你想在这里做的就是从mysql数据库中获取一些数据,然后用Python操作它,我会跳过它将它放到脚本中,然后使用the Python MySql module来进行SQL查询。
答案 1 :(得分:19)
如果希望脚本的行为与许多unix命令行工具一样,并接受管道或文件名作为第一个参数,则可以使用以下命令:
#!/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
答案 2 :(得分:10)
当您将一个命令的输出传递给python脚本时,它将转到sys.stdin。您可以像文件一样从sys.stdin中读取。例如:
import sys
print sys.stdin.read()
该程序从字面上输出其输入。
答案 3 :(得分:3)
由于在搜索piping data to a python script
时Google会在Google顶部显示此答案,因此我想添加另一种方法,我在J. Beazley's Python Cookbook找到更少的&#后找到该方法39;砂砾' aproach比使用sys
。 IMO,即使对新用户来说也更具有pythonic和不言自明。
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.
如果您需要更复杂的解决方案,可以评估argparse
和fileinput
as shown in this gist by martinth:
import argpase
import fileinput
if __name__ == '__main__':
parser = ArgumentParser()
parser.add_argument('--dummy', help='dummy argument')
parser.add_argument('files', metavar='FILE', nargs='*', help='files to read, if empty, stdin is used')
args = parser.parse_args()
# If you would call fileinput.input() without files it would try to process all arguments.
# We pass '-' as only file when argparse got no files which will cause fileinput to read from stdin
for line in fileinput.input(files=args.files if len(args.files) > 0 else ('-', )):
print(line)
```
答案 4 :(得分:1)
您可以使用命令行工具xargs
echo 'arg1' | xargs python script.py
arg1
中的sys.argv[1]
访问 script.py
答案 5 :(得分:0)
我在尝试将bash命令传递给我未编写(并且不想修改以接受sys.stdin
的python脚本)时遇到了偶然发现。我发现此处(https://superuser.com/questions/461946/can-i-use-pipe-output-as-a-shell-script-argument)提到的进程替换可以正常工作。
例如
some_script.py -arg1 <(bash command)