Jadi saya pikir saya menemukan cara untuk menyelesaikan ini karena tampaknya subproses terus menerus itu cukup mudah.
Berikut adalah kode yang saya gunakan:
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')
Saya menggunakan stdin.write karena itu adalah satu-satunya cara untuk mengirim banyak perintah daripada harus memulai kembali proses python saya untuk setiap contoh, dan saya juga telah membuat mode yang menggabungkan semuanya bersama-sama agar semuanya ditangani oleh communicate
.
Sebagai contoh, input fungsi dapat:
commands=['import numpy as np','a=np.rand(3,2,1)','print(a)']
EDIT_ hal penting untuk dipertimbangkan
Bagi siapa pun yang berencana untuk mengandalkan ini, jika Anda berencana untuk mengirim string ada 2 hal penting untuk dipertimbangkan!
- Anda harus menemukan cara untuk mempertahankan tanda kutip di setiap ujung string, berikut adalah cara yang mungkin untuk melestarikannya
['"',"'",'\'',"\"","\'",'\"',"""'""",'''"''']
- Hal lain yang penting untuk dipertimbangkan adalah jika Anda berencana menggunakan string yang mengindikasikan path atau berisi
\
di dalamnya, tambahkan 'r'
ke awal string sehingga encode akan menafsirkannya sebagai string mentah dan tidak membuang kesalahan yang disebabkan oleh \
dan karakter di sekitarnya.
Pid = os.getpid()
danDETACHED_PROCESS = 0x00000008
danRunScript = "C:/Folder/Path/VerifyPID.cmd"
danCmd = ["cmd.exe", "/C", RunScript, sys.argv[0], TagName, host, RootPath, str(Pid)]
dansubprocess.Popen(Cmd, shell=True, stdin=PIPE, stdout=PIPE, stderr=PIPE, creationflags=DETACHED_PROCESS)
.... Mungkin itu akan memberi Anda ide kasar tetapi saya punya lebih banyak contoh jika diperlukan. Sekali lagi saya tidak 100% yakin tetapi berpotensi sesuatu di sepanjang garis ini akan membantu.