Então eu acho que encontrei uma maneira de resolver isso, pois parece que o subprocesso é contínuo, foi bastante simples.
Aqui está o código que usei:
import subprocess as sb
from time import sleep
bat_file="C:\...\python_env.bat"
def executor(commands:list,mode=0):
#initiate the process with the batch file
proc=sb.Popen(bat_file, shell=False, stdin=sb.PIPE, stdout=sb.PIPE, stderr=sb.PIPE,)
sleep(18)#Make sure python gets initiated
if mode==0:
for command in commands:#send commands
proc.stdin.write((command+'\r\n').encode(encoding='utf-8',errors='strict'))
outp=proc.communicate('print("done") \r\n'.encode(encoding='utf-8',errors='strict'),timeout=999999999)
elif mode:
commands="\r\n".join(commands)+"\r\n"
outp=proc.communicate(commands.encode(encoding='utf-8',errors='strict'),timeout=999999999)
#print all the console outputs
print(outp[0].decode(encoding='utf_8', errors='strict'))
print('done')
Eu usei stdin.write, pois era a única maneira de enviar vários comandos em vez de ter que reiniciar meu processo python para cada instância, e também fiz um modo que concatenava tudo para que todos fossem manipulados por communicate
.
Como exemplo, a entrada da função poderia ser:
commands=['import numpy as np','a=np.rand(3,2,1)','print(a)']
EDIT_ coisas importantes a serem consideradas
Para qualquer um que planeje contar com isso, se você planeja enviar uma sequência de caracteres, há duas coisas importantes a serem consideradas!
- Você deve encontrar uma maneira de preservar suas aspas em cada extremidade da string, aqui estão as possíveis maneiras de preservá-las.
['"',"'",'\'',"\"","\'",'\"',"""'""",'''"''']
- Outra coisa importante a considerar é se você planeja usar uma string que indique caminhos ou contenha
\
, adicione'r'
ao início da string para que a codificação a interprete como uma string bruta e não lançar uma causa de erro por\
e os caracteres em torno dele.