Interagir com o Python do shell de outro python

1

Então, meu problema é o seguinte:

Estou usando uma versão do python com minhas bibliotecas principais, para fazer algo que preciso para interagir com as bibliotecas python de um programa. Esse programa vem com um arquivo .bat que configura as variáveis e inicia o python.

O que eu quero fazer do meu python principal é o seguinte:

  1. chame o arquivo .bat
  2. Da sessão do python criada import minha função personalizada
  3. Enviar entradas para funções personalizadas (listas aninhadas de cadeias de caracteres principalmente)
  4. Pare a nova instância do python quando os dados forem processados

Como isso pode ser feito a partir de python? Devo me ancorar ao prompt do cmd que é criado para poder enviar o comando para a nova instância do python? Será que os ou subprocess ainda seria viável ou precisaria criar algo como um script do PowerShell para entregar tudo?

Obrigado.

    
por Al rl 21.05.2018 / 16:25

1 resposta

1

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!

  1. Você deve encontrar uma maneira de preservar suas aspas em cada extremidade da string, aqui estão as possíveis maneiras de preservá-las. ['"',"'",'\'',"\"","\'",'\"',"""'""",'''"''']
  2. 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.
por 24.05.2018 / 02:58