44

mysqlコマンドを実行し、その出力をPythonスクリプトの変数に設定したいと思います。

これが私が実行しようとしているシェルコマンドです:

$ 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スクリプトでデータを取得するには、stdinから読み取る必要があります。

#!/usr/bin/env python

import sys

def hello(variable):
    print variable

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

ここで実行したいのがmysqlデータベースからデータを取得し、それをPythonで操作することだけである場合、スクリプトへのパイプをスキップし、PythonMySqlモジュールを使用して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

1つのコマンドの出力をpythoスクリプトにパイプすると、sys.stdinに移動します。sys.stdinからファイルと同じように読み取ることができます。例:

import sys

print sys.stdin.read()

このプログラムは文字通りその入力を出力します。

于 2012-06-19T21:44:28.740 に答える
9

この回答はGoogleで検索すると上部に表示されるので、を使用するよりも「ざらざらした」アプローチを検索した後、J。BeazleyのPythonクックブックpiping data to a python scriptで見つけた別のメソッドを追加したいと思います。IMO、よりPython的で、新しいユーザーにもわかりやすい。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.

より複雑なソリューションが必要な場合は、マーティンスによってこの要点に示されているように、argparseコンパイルすることができます。fileinput

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コマンドを自分が作成していない(そして受け入れるように変更したくないsys.stdin)Pythonスクリプトにパイプしようとしていることに気づきました。ここで説明したプロセス置換(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 に答える