如何使用Python在外部控制台中编写/执行命令

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何使用Python在外部控制台中编写/执行命令相关的知识,希望对你有一定的参考价值。

我是Python的新手,无法找到解决以下问题的方法:

我想写python脚本,让我们说打开cmd并在for循环中执行几个命令。启动cmd(例如subprocess.run())并使用Python(v.3.6)进行预定义命令。

import subprocess
_path = "C:\..."
_exe = "...\cmd.exe"
subprocess.run(_path + _exe)
for i in range (1,100,1)
   ...

但是,如何将Python中的命令写入cmd?结果呢?我怎么能得到一个信号,我的cmd命令是否被执行所以我可以启动一个新命令(比如for循环)

感谢您的帮助和最诚挚的问候,

Andreas买家

答案

您可能想使用Popen.communicate(input=None, timeout=None)并将shell arg设置为true。然后,您要等待进程输出流以响应您的命令。注意:Popen.communicate要求输入是字节编码的。 Popen.communicate的输出也是字节编码的,因此您需要在其上执行str.decode()以提取编码的字符串。

所有这些都在Python API中完整记录。我建议你阅读手册。

或者,您可以使用像this one这样的库来包装所有这些东西。

import subprocess

proc = subprocess.Popen('ls', stdout=subprocess.PIPE, stdin=subprocess.PIPE)
try:
    outs, errs = proc.communicate(timeout=15) # use input= param if you need to
    proc.wait()
except TimeoutExpired:
    proc.kill()
    outs, errs = proc.communicate()

print ('%s, %s' % (outs, errs))

输出和与实际'ls'输出的比较:

$ python popen_ex.py 
b'__pycache__
popen_ex.py
', None
$ ls
__pycache__ popen_ex.py

您需要发送到popen的任何其他命令都可以在proc.communicate中发送。

如果您真的想要与交互式shell进行通信,Popen.communicate()允许一次写入stdin并从stdout / stderr读取。在调用Popen.communicate()之后,输入/输出/错误流由子进程关闭。如果你想要一个完全交互式的外壳,你必须自己写一个,或者使用一个库,就像我链接的那样。

import subprocess
proc = subprocess.Popen('sh', stdout=subprocess.PIPE, stdin=subprocess.PIPE, stderr=subprocess.PIPE)
try:
    outs, errs = proc.communicate(input='ls'.encode('ascii'), timeout=15)
    proc.wait()
    print ('%s, %s' % (outs, errs))

    proc = subprocess.Popen('sh', stdout=subprocess.PIPE, stdin=subprocess.PIPE, stderr=subprocess.PIPE)
    outs, errs = proc.communicate(input='ps'.encode('ascii'), timeout=15)
    proc.wait()
    print ('%s, %s' % (outs, errs))
except TimeoutError:
    proc.kill()
    outs, errs = proc.communicate()

输出和与实际'ls','ps'的比较

$ python popen_ex.py 
    b'__pycache__
popen_ex.py
', b''
    b'  PID TTY           TIME CMD
  879 ttys000    0:00.18 -bash
 7063 ttys000    0:00.06 python popen_ex.py
 7066 ttys000    0:00.00 sh
  911 ttys001    0:00.06 -bash
  938 ttys002    0:00.16 -bash
 6728 ttys002    0:00.11 python
  972 ttys004    0:00.06 -bash
 1019 ttys005    0:00.06 -bash
 1021 ttys006    0:00.06 -bash
 1023 ttys007    0:00.06 -bash
', b''
$ ls
    __pycache__ popen_ex.py
$ ps
      PID TTY           TIME CMD
      879 ttys000    0:00.19 -bash
      911 ttys001    0:00.06 -bash
      938 ttys002    0:00.16 -bash
     6728 ttys002    0:00.11 python
      972 ttys004    0:00.06 -bash
     1019 ttys005    0:00.06 -bash
     1021 ttys006    0:00.06 -bash
     1023 ttys007    0:00.06 -bash

以上是关于如何使用Python在外部控制台中编写/执行命令的主要内容,如果未能解决你的问题,请参考以下文章

Spyder外部系统终端不起作用(Python3.6)

Webview 链接在外部浏览器中打开

如何在可视模式下在外部过滤器命令中使用 vim 变量?

如何在外部 COM 调用期间抑制“此操作无法完成”消息?

Linux 如何查看进程和控制进程

隧道 AngularJs 请求在外部 API 中使用 Rails