1 votos

Interactuar con python shell de python otro

Así que mi problema es el siguiente:

Estoy usando una versión de python con mi principal bibliotecas, para hacer algo que necesita la interfaz con un programa de librerías de python. Que programa viene con un .bat archivo que configura las variables y empezar a python.

Lo que quiero hacer de mi python principal es la siguiente:

  1. llame a la .bat archivo
  2. Desde el python sesión creada import mi función personalizada
  3. Envío de entradas a mí funciones personalizadas (listas anidadas de las cadenas en su mayoría)
  4. Detener el nuevo python instancia una vez que los datos se procesan

¿Cómo puede una cosa ser hecho desde python? Debo de anclaje del mismo a la consola cmd que se crea con el fin de ser capaz de enviar comandos a la nueva python instancia? Sería os o subprocess todavía ser viables o tengo que crear algo así como un script de powershell para todos?

Gracias.

1voto

Al rl Puntos 16

Así que creo que he encontrado una manera de resolver esto ya que parece que el subproceso es continua fue bastante sencillo.

Aquí está el código que he usado:

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')

He utilizado stdin.escribir, ya que era la única manera de enviar varios comandos en lugar de tener que reiniciar mi python proceso para cada instancia, y también he hecho de un modo que concatenar todo junto en fin todo será manejado por communicate.

Como un ejemplo de la entrada de la función podría ser :

commands=['import numpy as np','a=np.rand(3,2,1)','print(a)']

EDIT_ cosas importantes a considerar

Para cualquier persona que planea confiar en esto, si usted planea enviar a cadena hay 2 cosas importantes a considerar!

  1. Usted debe encontrar una manera de preservar su comillas en cada extremo de la cadena, aquí están las maneras posibles para preservar ['"',"'",'\'',"\"","\'",'\"',"""'""",'''"''']
  2. Otra cosa que es importante considerar es si usted planea usar cadena que indican las rutas o que contengan \ de ellos, añada 'r' para el inicio de la cadena para la codificación se interpreta como una cadena sin formato y no tirar un error causa por \ y los personajes que la rodean.

EnMiMaquinaFunciona.com

EnMiMaquinaFunciona es una comunidad de administradores de sistemas en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros sysadmin, hacer tus propias preguntas o resolver las de los demás.

Powered by: