Поэтому я думаю, что нашел способ решить эту проблему, так как кажется, что подпроцесс является непрерывным, он был довольно простым.
Вот код, который я использовал:
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')
Я использовал stdin.write, так как это был единственный способ посылать несколько команд вместо необходимости перезапускать мой процесс Python для каждого экземпляра, и я также создал режим, который объединяет все вместе для того, чтобы все обрабатывалось communicate
.
В качестве примера входные данные функции могут быть:
commands=['import numpy as np','a=np.rand(3,2,1)','print(a)']
EDIT_ важные вещи для рассмотрения
Для тех, кто планирует положиться на это, если вы планируете отправить строку, есть две важные вещи, которые следует учитывать!
- Вы должны найти способ сохранить свои кавычки на каждом конце строки, вот возможные способы сохранить их
['"',"'",'\'',"\"","\'",'\"',"""'""",'''"''']
- Еще одна важная вещь: если вы планируете использовать строки, которые указывают пути или содержат
\
в них, добавьте 'r'
в начало строки, чтобы кодирование интерпретировал ее как необработанную строку и не выдавал ошибку, вызванную \
и персонажи, окружающие его.