1

Итак, моя проблема заключается в следующем:

Я использую версию python с моими основными библиотеками, чтобы сделать что-то, что мне нужно для взаимодействия с библиотеками программы python. Эта программа поставляется с файлом .bat который устанавливает переменные и запускает python.

Что я хочу сделать от моего основного питона, так это:

  1. вызвать файл .bat
  2. Из созданной сессии Python import мою пользовательскую функцию
  3. Отправить входные данные для меня пользовательских функций (в основном, вложенные списки строк)
  4. Остановите новый экземпляр Python после обработки данных

Как такое можно сделать из python? Должен ли я привязать себя к приглашению cmd, которое создается для того, чтобы можно было отправить команду новому экземпляру python? os бы или subprocess еще быть жизнеспособным или мне нужно , чтобы создать что - то вроде Powershell скрипт в руки все это?

Благодарю.

1 ответ1

1

Поэтому я думаю, что нашел способ решить эту проблему, так как кажется, что подпроцесс является непрерывным, он был довольно простым.

Вот код, который я использовал:

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_ важные вещи для рассмотрения

Для тех, кто планирует положиться на это, если вы планируете отправить строку, есть две важные вещи, которые следует учитывать!

  1. Вы должны найти способ сохранить свои кавычки на каждом конце строки, вот возможные способы сохранить их ['"',"'",'\'',"\"","\'",'\"',"""'""",'''"''']
  2. Еще одна важная вещь: если вы планируете использовать строки, которые указывают пути или содержат \ в них, добавьте 'r' в начало строки, чтобы кодирование интерпретировал ее как необработанную строку и не выдавал ошибку, вызванную \ и персонажи, окружающие его.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .