从另一个 python 与 shell python 进行交互

从另一个 python 与 shell python 进行交互

我的问题如下:

我正在使用带有主库的 Python 版本来执行一些需要与程序的 Python 库交互的操作。该程序附带一个.bat设置变量并启动 Python 的文件。

我想要从我的主 python 中执行的操作如下:

  1. 调用.bat文件
  2. 从python会话创建import我的自定义函数
  3. 将自定义函数的输入发送给我(主要是嵌套的字符串列表)
  4. 数据处理完成后停止新的 Python 实例

如何用 Python 完成这样的事情?我是否应该将自己锚定到创建的 cmd 提示符上,以便能够将命令发送到新的 Python 实例?是否os仍然subprocess可行,还是我需要创建类似 powershell 脚本的东西来处理这一切?

谢谢。

答案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_需要考虑的重要事项

对于任何计划依赖此功能的人来说,如果您计划发送字符串,则有 2 件重要的事情需要考虑!

  1. 您必须找到一种方法来保留字符串两端的引号,以下是可能的保留方法['"',"'",'\'',"\"","\'",'\"',"""'""",'''"''']
  2. 另一件需要考虑的重要事情是,如果您计划使用指示路径或包含\路径的字符串,请将其添加'r'到字符串的开头,以便编码将其解释为原始字符串,并且不会因其\周围的字符而引发错误。

相关内容