与另一个python的shell python交互


1

所以我的问题是:

我在主库中使用的是python版本,需要做一些与程序的python库接口的操作。该程序带有一个.bat设置变量并启动python的文件。

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

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

如何从python完成这样的事情?我是否应该将自己锚定在创建的cmd提示符下,以便能够将命令发送到新的python实例?会ossubprocess仍是可行的或者我需要创造这样一个PowerShell脚本交出这一切?

谢谢。


这听起来像我过去做过的事情,但不是100%可以肯定,但是例如... Pid = os.getpid()以及DETACHED_PROCESS = 0x00000008and RunScript = "C:/Folder/Path/VerifyPID.cmd"Cmd = ["cmd.exe", "/C", RunScript, sys.argv[0], TagName, host, RootPath, str(Pid)]and subprocess.Popen(Cmd, shell=True, stdin=PIPE, stdout=PIPE, stderr=PIPE, creationflags=DETACHED_PROCESS)....也许这会让您有个大概的想法,但是如果需要的话,我还有更多示例。同样,我不是100%肯定,但按照这些思路可能会有所帮助。
Pimp Juice IT

这是一个链接,其中包含代码的详细信息,以帮助澄清一些潜在的问题。..... justpaste.it/663m5 ....使用MySQL和PLC模块等时,我使用的逻辑要复杂得多,并且调用函数等。也许您会发现至少对您有所帮助的方向有所帮助。最后,该批处理脚本将接受参数作为%~1直通%~5本质。
Pimp Juice IT

@PimpJuiceIT谢谢!我会研究它,看看是否可以那样做。
Al rl

1
@PimpJuiceIT您的提示为我的解决方案提供了帮助,尽管我进行了一些更改,但您应该熟悉该概念。再次感谢!
铝RL

Answers:


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'中的字符串,请添加到字符串的开头,以便编码将其解释为原始字符串,并且不会因\和周围的字符而引起错误它。
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.