鱼C论坛

 找回密码
 立即注册
查看: 2143|回复: 14

[已解决]Python 交互式执行cmd命令

[复制链接]
发表于 2020-6-22 09:52:42 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
如题,应该用什么库呢?我尝试了pexpect.popen_spawn,代码如下
import pexpect
from pexpect import popen_spawn

child=pexpect.popen_spawn.PopenSpawn('python run.py')
child.expect('Input something?')

但效果是run.py的代码执行了,但是并没有打开控制台,报错:
pexpect.exceptions.TIMEOUT: <pexpect.popen_spawn.PopenSpawn object at 0x00000264737950B8>
searcher: searcher_re:
    0: re.compile(b'Input something?')
<pexpect.popen_spawn.PopenSpawn object at 0x00000264737950B8>
searcher: searcher_re:
    0: re.compile(b'Input something?')

有人做过类似的吗?这应该是个挺常见的需求。
最佳答案
2020-6-22 10:17:29
FC的注册很坑 发表于 2020-6-22 10:16
os.system和subprocess这两种方法我知道的,他们都是后台执行cmd命令的,主要问题不是怎么执行cmd命令, ...

我之前自己瞎写了一个,你看看行不
import os
import subprocess

ml = ''
os.chdir("C:\\Users")
while ml != 'exit':
    ml = input(os.getcwd() + '> ')
    if 'cd' in ml:
        try:
            os.chdir(ml.split('cd ')[1])
        except FileNotFoundError as reason:
            print(reason)
            continue
        except:
            resp = subprocess.Popen(ml + ' /?', shell = True,stdin=subprocess.PIPE, stdout=subprocess.PIPE, stderr=subprocess.PIPE).communicate()
            print(resp[0].decode('gbk'), resp[1].decode('gbk'))
    elif ml[:-1].isalpha() and len(ml) == 2 and ml[-1] == ':':
        os.chdir(ml[:-1] + ':\\')
    else:
        resp = subprocess.Popen(ml, shell = True,stdin=subprocess.PIPE, stdout=subprocess.PIPE, stderr=subprocess.PIPE).communicate()
        print(resp[0].decode('gbk'), resp[1].decode('gbk'))
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2020-6-22 10:01:03 | 显示全部楼层
这应该是个非常不常见的需求。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-6-22 10:03:53 | 显示全部楼层
wp231957 发表于 2020-6-22 10:01
这应该是个非常不常见的需求。

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-6-22 10:08:37 | 显示全部楼层
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-6-22 10:16:12 | 显示全部楼层
Twilight6 发表于 2020-6-22 10:08
看看呗,点击蓝字:

python执行cmd命令的几种方法

os.system和subprocess这两种方法我知道的,他们都是后台执行cmd命令的,主要问题不是怎么执行cmd命令,是需要做交互啊
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-6-22 10:17:29 | 显示全部楼层    本楼为最佳答案   
FC的注册很坑 发表于 2020-6-22 10:16
os.system和subprocess这两种方法我知道的,他们都是后台执行cmd命令的,主要问题不是怎么执行cmd命令, ...

我之前自己瞎写了一个,你看看行不
import os
import subprocess

ml = ''
os.chdir("C:\\Users")
while ml != 'exit':
    ml = input(os.getcwd() + '> ')
    if 'cd' in ml:
        try:
            os.chdir(ml.split('cd ')[1])
        except FileNotFoundError as reason:
            print(reason)
            continue
        except:
            resp = subprocess.Popen(ml + ' /?', shell = True,stdin=subprocess.PIPE, stdout=subprocess.PIPE, stderr=subprocess.PIPE).communicate()
            print(resp[0].decode('gbk'), resp[1].decode('gbk'))
    elif ml[:-1].isalpha() and len(ml) == 2 and ml[-1] == ':':
        os.chdir(ml[:-1] + ':\\')
    else:
        resp = subprocess.Popen(ml, shell = True,stdin=subprocess.PIPE, stdout=subprocess.PIPE, stderr=subprocess.PIPE).communicate()
        print(resp[0].decode('gbk'), resp[1].decode('gbk'))
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-6-22 10:21:59 | 显示全部楼层
FC的注册很坑 发表于 2020-6-22 10:16
os.system和subprocess这两种方法我知道的,他们都是后台执行cmd命令的,主要问题不是怎么执行cmd命令, ...

那我就不知了哈哈,楼上大佬,看看他的
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-6-22 10:26:57 | 显示全部楼层
qiuyouzhi 发表于 2020-6-22 10:17
我之前自己瞎写了一个,你看看行不

,果然我是个轮子都用不好的小白,还需要一个sendcontrol的功能,例如ctrl+C打断运行。。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-6-22 10:29:07 | 显示全部楼层
qiuyouzhi 发表于 2020-6-22 10:17
我之前自己瞎写了一个,你看看行不

感觉应该再加个else,检索键盘动作(或者是输入,还没想好,还得试一试),然后执行kill就能实现了吧?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-6-22 10:33:28 | 显示全部楼层
Twilight6 发表于 2020-6-22 10:21
那我就不知了哈哈,楼上大佬,看看他的

活捉大佬,本小白瑟瑟发抖,基础真的太差了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-6-22 10:34:58 | 显示全部楼层
FC的注册很坑 发表于 2020-6-22 10:26
,果然我是个轮子都用不好的小白,还需要一个sendcontrol的功能,例如ctrl+C打断运 ...

那或许需要多线程?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-6-22 10:42:43 | 显示全部楼层
qiuyouzhi 发表于 2020-6-22 10:34
那或许需要多线程?

试了下应该是的
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-6-22 10:44:20 | 显示全部楼层

我刚才看了下,貌似并不需要,就是反应速度有点慢
import os
import subprocess

ml = ''
os.chdir("C:\\Users")
while ml != 'exit':
    ml = input(os.getcwd() + '> ')
    if 'cd' in ml:
        try:
            os.chdir(ml.split('cd ')[1])
        except FileNotFoundError as reason:
            print(reason)
            continue
        except:
            resp = subprocess.Popen(ml + ' /?', shell = True,stdin=subprocess.PIPE, stdout=subprocess.PIPE, stderr=subprocess.PIPE).communicate()
            print(resp[0].decode('gbk'), resp[1].decode('gbk'))
    elif ml[:-1].isalpha() and len(ml) == 2 and ml[-1] == ':':
        os.chdir(ml[:-1] + ':\\')
    else:
        try:
            resp = subprocess.Popen(ml, shell = True,stdin=subprocess.PIPE, stdout=subprocess.PIPE, stderr=subprocess.PIPE).communicate()
        except KeyboardInterrupt:
            continue
        print(resp[0].decode('gbk'), resp[1].decode('gbk'))
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-6-22 10:54:47 | 显示全部楼层
qiuyouzhi 发表于 2020-6-22 10:44
我刚才看了下,貌似并不需要,就是反应速度有点慢

好像不行的吧,我写了个while True的死循环脚本,输入命令“Python XX.py”运行这个脚本
会卡在resp = subprocess.Popen(ml, shell = True,stdin=subprocess.PIPE, stdout=subprocess.PIPE, stderr=subprocess.PIPE).communicate()这步的,执行不到下一个while ml != 'exit':循环
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-6-22 11:04:24 | 显示全部楼层
FC的注册很坑 发表于 2020-6-22 10:54
好像不行的吧,我写了个while True的死循环脚本,输入命令“Python XX.py”运行这个脚本
会卡在resp = s ...

那就得用多线程了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-1-20 12:09

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表