终端中的 Python 脚本执行命令

我前段时间在某个地方读过这本书,但似乎找不到了。我正在尝试找到一个命令,它将在终端中执行命令,然后输出结果。

例如: 脚本将是:

command 'ls -l'

它将输出在终端中运行该命令的结果

415366 次浏览

有几种方法可以做到这一点:

一个简单的方法是使用 OS 模块:

import os
os.system("ls -l")

子流程模块可以实现更复杂的功能: 例如:

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

您还应该查看 commands.getstatusoutput

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

为了伊丝

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']

Os.popen ()的使用非常简单,但是自从 Python 2.6以来就不再使用它了。 您应该改用 子流程模块。

阅读此处: 将 os.popen (命令)读入字符串

我更喜欢子进程模块的用法:

from subprocess import call
call(["ls", "-l"])

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

abc = a.c
call(["vim", abc])
import os
os.system("echo 'hello world'")

我不知道如何将输出打印到 pythonShell 中。

您可以导入‘ os’模块并像这样使用它:

import os
os.system('#DesiredAction')

朱庇特

在一个木星笔记本电脑,你可以使用神奇的功能 !

!echo "execute a command"
files = !ls -a /data/dir/ #get the output into a variable

巨蟒

要将其作为 .py脚本执行,需要使用 ipython

files = get_ipython().getoutput('ls -a /data/dir/')

执行脚本

$ ipython my_script.py

对于 python3使用子进程

import subprocess
s = subprocess.getstatusoutput(f'ps -ef | grep python3')
print(s)

你也可以检查错误:

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
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

在 python3中,标准的方法是使用 subprocess.run

res = subprocess.run(['ls', '-l'], capture_output=True)
print(res.stdout)
  • 运行 : subprocess.run
  • 输出 : subprocess.PIPE
  • 错误 : 提高 RuntimeError

#! /usr/bin/env python3
import subprocess




def runCommand (command):
output=subprocess.run(
command,
stdout=subprocess.PIPE,
stderr=subprocess.PIPE)


if output.returncode != 0:
raise RuntimeError(
output.stderr.decode("utf-8"))


return output




output = runCommand ([command, arguments])
print (output.stdout.decode("utf-8"))