Berinteraksi dengan shell python dari python lain

1

Jadi masalah saya adalah sebagai berikut:

Saya menggunakan versi python dengan perpustakaan utama saya, untuk melakukan sesuatu yang saya butuhkan untuk berinteraksi dengan perpustakaan python program. Program itu dilengkapi dengan .bat file yang mengatur variabel dan mulai python.

Apa yang ingin saya lakukan dari python utama saya adalah sebagai berikut:

  1. panggil .bat mengajukan
  2. Dari sesi python dibuat import fungsi kustom saya
  3. Kirim input ke saya fungsi khusus (kebanyakan daftar string)
  4. Hentikan instance python baru setelah data diproses

Bagaimana hal seperti itu dapat dilakukan dari python? Haruskah saya jangkar diri ke prompt cmd yang dibuat untuk dapat mengirim perintah ke instance python baru? Akan os atau subprocess masih layak atau akankah saya perlu membuat sesuatu seperti skrip PowerShell untuk menyerahkan semuanya?

Terima kasih.

Al rl
sumber
Ini terdengar seperti sesuatu yang telah saya lakukan di masa lalu tetapi tidak 100% pasti tetapi misalnya .... Pid = os.getpid() dan DETACHED_PROCESS = 0x00000008 dan RunScript = "C:/Folder/Path/VerifyPID.cmd" dan Cmd = ["cmd.exe", "/C", RunScript, sys.argv[0], TagName, host, RootPath, str(Pid)] dan subprocess.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.
Pimp Juice IT
Berikut ini tautan dengan detail lebih lanjut tentang seperti apa kode tersebut untuk membantu memperjelas beberapa potensi ..... justpaste.it/663m5 .... Logika yang saya gunakan jauh lebih kompleks dengan menggunakan modul MySQL dan PLC, dll. Dan fungsi pemanggilan dan semacamnya .... mungkin Anda akan menemukan bantuan untuk setidaknya mengarahkan Anda ke arah yang dapat membantu. Pada akhirnya, skrip kumpulan akan menerima argumen sebagai %~1 melalui %~5 dasarnya.
Pimp Juice IT
@PimpJuiceIT Terima kasih! Saya akan memeriksanya dan melihat apakah itu bisa dilakukan dengan cara itu.
Al rl
1
@PimpJuiceIT Isyarat Anda membantu untuk solusi saya, meskipun saya membuat beberapa perubahan tetapi konsepnya seharusnya tidak asing bagi Anda. Terima kasih lagi!
Al rl

Jawaban:

1

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!

  1. Anda harus menemukan cara untuk mempertahankan tanda kutip di setiap ujung string, berikut adalah cara yang mungkin untuk melestarikannya ['"',"'",'\'',"\"","\'",'\"',"""'""",'''"''']
  2. 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.
Al rl
sumber