Python脚本在终端中执行命令

Ali*_*Ali 89 python terminal

我刚才在某个地方看过这个,但似乎无法找到它.我试图找到一个命令,将在终端中执行命令,然后输出结果.

例如:脚本将是:

command 'ls -l'
Run Code Online (Sandbox Code Playgroud)

它将导致在终端中运行该命令的结果

Uku*_*kit 161

做这件事有很多种方法:

一种简单的方法是使用os模块:

import os
os.system("ls -l")
Run Code Online (Sandbox Code Playgroud)

使用子进程模块可以实现更复杂的事情:例如:

import subprocess
test = subprocess.Popen(["ping","-W","2","-c", "1", "192.168.1.70"], stdout=subprocess.PIPE)
output = test.communicate()[0]
Run Code Online (Sandbox Code Playgroud)

  • 我不想低估你.你应该使用subprocess来处理所有事情.这样更安全.subprocess.call()将为您提供一个很好的接口,以替换简单的调用表单. (31认同)
  • 如何获得命令的完整响应, `os.system("nslookup gmail.com")` 只返回最后一行 `0`,但我想获得完整的响应。 (3认同)
  • @JorgeVargas你能帮我理解为什么子过程应该用于所有东西吗?为什么更安全? (2认同)

小智 29

我更喜欢使用子进程模块:

from subprocess import call
call(["ls", "-l"])
Run Code Online (Sandbox Code Playgroud)

原因是如果你想在脚本中传递一些变量,这给出了非常简单的方法,例如采用以下部分代码

abc = a.c
call(["vim", abc])
Run Code Online (Sandbox Code Playgroud)

  • 对于我打开带有额外参数 `call(["eog", "1breeproposal.png", "-f"])` 的图片效果很好 (2认同)

小智 10

import os
os.system("echo 'hello world'")
Run Code Online (Sandbox Code Playgroud)

这应该有效。我不知道如何将输出打印到 python Shell 中。


Avi*_*dan 8

对于 python3 使用子进程

import subprocess
s = subprocess.getstatusoutput(f'ps -ef | grep python3')
print(s)
Run Code Online (Sandbox Code Playgroud)

您还可以检查是否有错误:

import subprocess
s = subprocess.getstatusoutput('ls')
if s[0] == 0:
    print(s[1])
else:
    print('Custom Error {}'.format(s[1]))


# >>> Applications
# >>> Desktop
# >>> Documents
# >>> Downloads
# >>> Library
# >>> Movies
# >>> Music
# >>> Pictures
Run Code Online (Sandbox Code Playgroud)
import subprocess
s = subprocess.getstatusoutput('lr')
if s[0] == 0:
    print(s[1])
else:
    print('Custom Error: {}'.format(s[1]))

# >>> Custom Error: /bin/sh: lr: command not found
Run Code Online (Sandbox Code Playgroud)


pyf*_*unc 7

事实上,关于子进程的任何问题都是一个很好的解读


min*_*cha 5

您还应该查看 commands.getstatusoutput

这将返回一个长度为 2 的元组。第一个是返回整数(0 - 当命令成功时)第二个是整个输出,将在终端中显示。

对于 ls

    import commands
    s=commands.getstatusoutput('ls')
    print s
    >> (0, 'file_1\nfile_2\nfile_3')
    s[1].split("\n")
    >> ['file_1', 'file_2', 'file_3']
Run Code Online (Sandbox Code Playgroud)