使用cmd进程python

雅各布

我试图让我的基本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

我做错了什么,正确的做法是什么?

让·弗朗索瓦·法布尔

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

但是否则它很笨拙,因为它只发送一次输入。因此,一旦发生这种情况:

stdout, stderr = self.cmd.communicate()

完成后,您将无法向流程发送更多输入。

另一种方法是:

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

但在这里这会太过分了。什么是矫枉过正首先是Popen在Windowscmd的过程,当你不需要它在所有加上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()
    rc = p.wait()   # wait for process to end & get return code
    if rc:
       break  # optional: exit if nox_adb command fails
    time.sleep(1)

ifnox_adb是一个.bat不会被剪切文件,在这种情况下,命令的前缀为cmd /c

    p = subprocess.Popen(["cmd","/c","nox_adb","devices"],cwd="C:/Program Files (x86)/Nox/bin",stdout=subprocess.PIPE)

这大致相当于shell=True在Windows上添加,但是这shell=True是一种解决问题的懒惰方法,就像回飞镖一样,几年后又出现在您的脑海中,因此最好在工业解决方案中避免它。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

python使用netstat命令在cmd上获取文件进程名称

来自分类Dev

在 Python 中使用子进程,在 Python cmd 和 Python IDLE 中得到不同的结果

来自分类Dev

进程输出比使用cmd慢得多

来自分类Dev

进程输出比使用cmd慢得多

来自分类Dev

Python-如何执行shell cmd'last | grep“已登录”'使用子进程。

来自分类Dev

使用 python 2.7 通过子进程模块实现 os.system(cmd &) 行为

来自分类Dev

Python子进程命令以静默方式运行,防止cmd出现

来自分类Dev

使用CMD根据其描述查找Windows进程

来自分类Dev

如何使用子进程popen清除“ cmd.exe”的STDOUT?

来自分类Dev

如何使用“ tasklist” cmd检索完整的进程名称?

来自分类Dev

使用cmd.exe调用子进程的示例

来自分类Dev

使用ConEmu在cmd窗口中运行多个进程

来自分类Dev

使用cmd更改进程优先级

来自分类Dev

使用子进程模块将击键输入cmd

来自分类Dev

检查CMD作为进程使用时是否空闲

来自分类Dev

使用crontab的Python子进程

来自分类Dev

使用python的子进程模块打开python进程

来自分类Dev

python中的多进程仅使用一个进程

来自分类Dev

使用Python子进程检测进程是否干净退出

来自分类Dev

Linux中的Python:使用Shell杀死进程和子进程

来自分类Dev

在python子进程中为后台进程使用'&'

来自分类Dev

使用多进程方法时如何管理python进程

来自分类Dev

使用Python立即启动Python子进程

来自分类Dev

使用Python立即启动Python子进程

来自分类Dev

在python 3中使用子进程

来自分类Dev

python使用多进程过滤大量文件

来自分类Dev

使用Python子进程运行npm命令

来自分类Dev

Python:使用子进程发送postgres密码

来自分类Dev

使用多个进程在Python中写入文件

Related 相关文章

热门标签

归档