unix 通过管道将shell命令的输出传输到python脚本

xlpyo6sf  于 2022-11-23  发布在  Unix
关注(0)|答案(7)|浏览(183)

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

ymzxtsji

ymzxtsji1#

您需要从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查询。

k5hmc34c

k5hmc34c2#

如果您希望您的脚本像许多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
093gszye

093gszye3#

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

import sys

print sys.stdin.read()

这个程序直接输出它的输入。

bn31dyow

bn31dyow4#

由于这个答案在搜索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.

如果你需要更复杂的解,你可以把argparsefileinput组合起来[如martinth的要点所示][2]:
第一次

xpcnnkqh

xpcnnkqh5#

可以使用命令行工具xargs
echo 'arg1' | xargs python script.py
现在可以从script.py中的sys.argv[1]访问arg1

kcugc4gi

kcugc4gi6#

同样适用于WindowsPython 3.10.3的 * 一行程序 * 使用sys.stdin.read(),如下所示:

echo 'Hello!' | python -c "import sys;d=sys.stdin.read(); print('{}\n'.format(d))"
zlhcx6iw

zlhcx6iw7#

我在尝试将一个bash命令传输到一个我没有编写的python脚本(也不想修改以接受sys.stdin)时偶然发现了这个问题。
例如some_script.py -arg1 <(bash command)

相关问题