Zusammenfassung: Ich möchte Python-Skripte schreiben, die sich wie Bash-Skripte in der Kommandozeile verhalten, aber dann würde ich sie auch gerne zusammenstellen leicht in Python. Wo ich Probleme habe, ist der Leim, um das Letztere geschehen zu lassen.Wie man Python-Skripte pipe-fähig machen kann in bash und in python
So vorstellen, schrieb ich zwei Skripte, script1.py
und script2.py
und ich kann Rohr sie zusammen etwa so:
echo input_string | ./script1.py -a -b | ./script2.py -c -d
Wie bekomme ich dieses Verhalten aus einer anderen Python-Datei? Hier ist der Weg, ich weiß, aber ich mag es nicht:
arg_string_1 = convert_to_args(param_1, param_2)
arg_string_2 = convert_to_args(param_3, param_4)
output_string = subprocess.check_output("echo " + input_string + " | ./script1.py " + arg_string_1 + " | ./script2.py " + arg_string_2)
Wenn ich nicht die Vorteile von Multi-Threading nehmen wollte, habe ich so etwas tun könnte (?):
input1 = StringIO(input_string)
output1 = StringIO()
script1.main(param_1, param_2, input1, output1)
input2 = StringIO(output1.get_value())
output2 = StringIO()
script2.main(param_3, param_4, input2, output2)
Hier ist der Ansatz, den ich versuchte, aber ich blieb stecken beim Schreiben des Klebers. Ich würde gerne lernen, wie ich meinen Ansatz unten fertigstellen kann, oder Vorschläge für ein besseres Design/Ansatz!
Mein Ansatz: Ich schrieb script1.py
und script2.py
aussehen:
#!/usr/bin/python3
... # import sys and define "parse_args"
def main(param_1, param_2, input, output):
for line in input:
...
print(stuff, file=output)
if __name__ == "__main__":
parameter_1, parameter_2 = parse_args(sys.argv)
main(parameter_1, parameter_2, sys.stdin, sys.stdout)
Dann wollte ich so etwas schreiben, aber nicht wissen, wie zu beenden: Für die
pipe_out, pipe_in = ????
output = StringIO()
thread_1 = Thread(target=script1.main, args=(param_1, param_2, StreamIO(input_string), pipe_out))
thread_2 = Thread(target=script2.main, args=(param_3, param_4, pipe_in, output)
thread_1.start()
thread_2.start()
thread_1.join()
thread_2.join()
output_str = output.get_value()
Danke, das scheint gut, nur eine Menge Code. Ich hatte gehofft, dass es etwas Konkretes geben könnte. Aber wenn die Leistung gut ist, könnte es sich lohnen. – usul
Es gibt viele Möglichkeiten, es zu reduzieren. Beispielsweise könnten Sie direkt aus einer Datei lesen und direkt in eine Datei innerhalb desselben Threads schreiben. Ich habe absichtlich viele Dinge getrennt, um viele Dinge einzeln zu illustrieren. –