Sommario: Mi piacerebbe scrivere script Python che si comportano come script bash sulla riga di comando, ma poi mi piacerebbe anche collegarli insieme facilmente in python. Dove sto avendo problemi è la colla per far accadere quest'ultimo.Come rendere gli script Python pipe-able sia in bash che all'interno di python
quindi immaginate ho scritto due sceneggiature, script1.py
e script2.py
e posso tubo insieme in questo modo:
echo input_string | ./script1.py -a -b | ./script2.py -c -d
Come faccio ad avere questo comportamento all'interno di un altro file Python? Ecco il modo in cui lo so, ma non mi piacciono:
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)
Se non volevo approfittare di multithreading, avrei potuto fare qualcosa di simile (?):
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)
Ecco l'approccio che stavo cercando, ma mi sono bloccato a scrivere la colla. Mi piacerebbe che imparassi come finire il mio approccio qui sotto, o suggerimenti per un migliore design/approccio!
Il mio approccio: Ho scritto script1.py
e script2.py
a guardare come:
#!/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)
Poi ho voluto scrivere qualcosa di simile, ma non so come finire:
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()
Grazie, questo sembra buono, solo un sacco di codice. Speravo che potesse esserci qualcosa di più conciso. Ma se la performance è buona, potrebbe valerne la pena. – usul
Ci sono molti modi per ridurlo. Ad esempio, puoi leggere direttamente da un file e scrivere direttamente in un file all'interno dello stesso thread. Ho separato di proposito un sacco di cose per illustrare molte cose individualmente. –