![从另一个 python 与 shell python 进行交互](https://linux22.com/image/1561556/%E4%BB%8E%E5%8F%A6%E4%B8%80%E4%B8%AA%20python%20%E4%B8%8E%20shell%20python%20%E8%BF%9B%E8%A1%8C%E4%BA%A4%E4%BA%92.png)
我的问题如下:
我正在使用带有主库的 Python 版本来执行一些需要与程序的 Python 库交互的操作。该程序附带一个.bat
设置变量并启动 Python 的文件。
我想要从我的主 python 中执行的操作如下:
- 调用
.bat
文件 - 从python会话创建
import
我的自定义函数 - 将自定义函数的输入发送给我(主要是嵌套的字符串列表)
- 数据处理完成后停止新的 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 件重要的事情需要考虑!
- 您必须找到一种方法来保留字符串两端的引号,以下是可能的保留方法
['"',"'",'\'',"\"","\'",'\"',"""'""",'''"''']
- 另一件需要考虑的重要事情是,如果您计划使用指示路径或包含
\
路径的字符串,请将其添加'r'
到字符串的开头,以便编码将其解释为原始字符串,并且不会因其\
周围的字符而引发错误。