使用cmd进程python

问题描述 投票:0回答:1

我正在尝试打开我的基本python脚本,并写入和读取cmd,以便允许它向noxplayer发送命令。我正在尝试使用子流程,并且发现并了解了有关使用PIPES而不是使用它们的信息。无论哪种方式,我都可以使用它来发送输入,从而导致一系列不同的断点。这是我尝试过的2个代码示例。

class bot:
    def __init__(self, num):
        self.num = num

    def start(self):
        #open app and command prompt
        androidArg1 = "C:/Program Files (x86)/Nox/bin/Nox.exe"
        androidArg2 = "-clone:Nox_" + str(self.num)
        androidArgs = [androidArg1, androidArg2]
        cmdArg1 = 'cmd'
        cmdArgs = [cmdArg1]
        self.app = subprocess.Popen(androidArgs)
        self.cmd = subprocess.Popen(cmdArgs, shell=True)

        self.cmd.communicate(input="cd C:/Program Files (x86)/Nox/bin")
        while True:
            self.devices = self.cmd.communicate(input="nox_adb devices")
            print(self.devices)

正在打印C:\Users\thePath>,但从未完成第一次通信

class bot:
    def __init__(self, num):
        self.num = num

    def start(self):
        #open app and command prompt
        androidArg1 = "C:/Program Files (x86)/Nox/bin/Nox.exe"
        androidArg2 = "-clone:Nox_" + str(self.num)
        androidArgs = [androidArg1, androidArg2]
        cmdArg1 = 'cmd'
        cmdArgs = [cmdArg1]
        self.app = subprocess.Popen(androidArgs)
        self.cmd = subprocess.Popen(cmdArgs, stdin=PIPE, stderr=PIPE, stdout=PIPE, universal_newlines=True, shell=True)
        stdout, stderr = self.cmd.communicate()
        stdout, stderr


        self.cmd.communicate(input="cd C:/Program Files (x86)/Nox/bin")
        while True:
            self.devices = self.cmd.communicate(input="nox_adb devices")
            print(self.devices)

投掷

Cannot send input after starting communication

我在做什么错,做这件事的正确方法是什么?

python subprocess
1个回答
1
投票

[communicate很棒,因为它能够分别读取标准输出和错误。

但是在其他情况下,它仅发送一次输入,因此非常笨拙。因此,一旦发生这种情况:

stdout, stderr = self.cmd.communicate()

结束,您无法向流程发送更多输入。

另一种方式是:

  • 逐行输入输入到处理中
  • 合并标准输出和错误(以避免死锁)

但是这里太过分了。首先,当您不需要Windows Popen进程中的cmd时,[Over]就是多余的。加上cd命令,再加上输入提要,再加上shell=True ...

使其简单

相反,请直接在循环中的Popen命令上使用nox(可能在两次调用之间有很小的延迟)。>>

我没有测试,但这是一种在给定目录中重复运行带有参数的命令并读取其输出的独立方法。

import time,subprocess while True: p = subprocess.Popen(["nox_adb","devices"],cwd="C:/Program Files (x86)/Nox/bin",stdout=subprocess.PIPE) devices = p.stdout.read().decode() p.wait() time.sleep(1)

© www.soinside.com 2019 - 2024. All rights reserved.