【发布时间】:2011-04-13 10:58:44
【问题描述】:
我不久前在某个地方读到过这篇文章,但似乎找不到。我正在尝试找到将在终端中执行命令然后输出结果的命令。
例如:脚本将是:
command 'ls -l'
它将在终端中运行该命令的结果
【问题讨论】:
-
我猜“终端”是指“在命令行中”,见superuser.com/questions/144666/…
我不久前在某个地方读到过这篇文章,但似乎找不到。我正在尝试找到将在终端中执行命令然后输出结果的命令。
例如:脚本将是:
command 'ls -l'
它将在终端中运行该命令的结果
【问题讨论】:
有几种方法可以做到这一点:
一个简单的方法是使用 os 模块:
import os
os.system("ls -l")
使用 subprocess 模块可以实现更复杂的事情: 例如:
import subprocess
test = subprocess.Popen(["ping","-W","2","-c", "1", "192.168.1.70"], stdout=subprocess.PIPE)
output = test.communicate()[0]
【讨论】:
os.system("nslookup gmail.com")只返回最后一行0,但是我想得到完整的响应。
我更喜欢使用子流程模块:
from subprocess import call
call(["ls", "-l"])
原因是,如果您想在脚本中传递一些变量,这提供了一种非常简单的方法,例如采用以下代码部分
abc = a.c
call(["vim", abc])
【讨论】:
call(["eog", "1breeproposal.png", "-f"])
事实上,任何关于 subprocess 的问题都值得一读
【讨论】:
import os
os.system("echo 'hello world'")
这应该可行。我不知道如何将输出打印到 python Shell 中。
【讨论】:
您还应该查看 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']
【讨论】:
对于 python3 使用子进程
import subprocess
s = subprocess.getstatusoutput(f'ps -ef | grep python3')
print(s)
【讨论】:
在python3中,标准方法是使用subprocess.run
res = subprocess.run(['ls', '-l'], capture_output=True)
print(res.stdout)
【讨论】:
os.popen() 使用起来非常简单,但自 Python 2.6 起已被弃用。 您应该改用 subprocess 模块。
【讨论】:
在 jupyter notebook 中你可以使用魔术函数!
!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
【讨论】:
#! /usr/bin/env python3
import subprocess
def run (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 = run ([command, arguments])
print (output.stdout.decode("utf-8"))
【讨论】:
您可以导入“os”模块并像这样使用它:
import os
os.system('#DesiredAction')
【讨论】: