44

我想运行一个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 脚本中的变量并让它打印输出?

4

6 回答 6

49

您需要从标准输入读取数据以检索 python 脚本中的数据,例如

#!/usr/bin/env python

import sys

def hello(variable):
    print variable

data = sys.stdin.read()
hello(data)

如果您在这里要做的只是从 mysql 数据库中获取一些数据,然后使用 Python 对其进行操作,那么我会跳过将其通过管道传输到脚本中,而只需使用Python MySql 模块来执行 SQL 查询。

于 2012-06-19T21:44:46.433 回答
31

如果您希望您的脚本表现得像许多 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
于 2012-06-19T23:53:21.053 回答
14

当您将一个命令的输出通过管道传输到 pytho 脚本时,它会转到 sys.stdin。您可以像读取文件一样从 sys.stdin 读取。例子:

import sys

print sys.stdin.read()

这个程序从字面上输出它的输入。

于 2012-06-19T21:44:28.740 回答
9

由于这个答案piping data to a python script搜索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.

如果您需要更复杂的解决方案,您可以编译argparsefileinput 如 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)

```

于 2017-01-09T09:41:04.333 回答
5

您可以使用命令行工具xargs

echo 'arg1' | xargs python script.py

arg1现在可以sys.argv[1]script.py

于 2020-04-01T21:49:04.603 回答
0

我偶然发现了这个尝试将 bash 命令传递给我没有编写的 python 脚本(并且不想修改为接受sys.stdin)。我发现这里提到的进程替换(https://superuser.com/questions/461946/can-i-use-pipe-output-as-a-shell-script-argument)可以正常工作。

前任。 some_script.py -arg1 <(bash command)

于 2018-10-04T20:20:14.227 回答