从交互式IPython shell中的函数调用shell命令

时间:2012-01-20 18:37:46

标签: python function shell ipython

我刚刚玩过IPython。目前我想知道如何在函数中运行带有python变量的shell命令。例如:

def x(go):
    return !ls -la {go}

x("*.rar")

这给了我“sh:1:语法错误:文件结束意外”。有人可以给我一个关于如何让我的“x”函数调用ls -la * .rar“的线索吗?我的工作目录中有* .rar文件。

提前谢谢你,   赖

5 个答案:

答案 0 :(得分:7)

如果查看history命令输出,您将看到调用外部程序ipython使用_ip.system方法。

因此,这应该适合你:

def x(go):
    return _ip.system("ls -la {0}".format(go))

但请注意,在ipython之外,您应该使用subprocess.Popen

答案 1 :(得分:1)

“!”中有一个bug shell访问使得“函数范围变量”的扩展失败。您的ipython版本可能会受到影响。

你可以自己做变量扩展来避免它:

def x(go):
    return get_ipython().getoutput("ls -la {0}".format(go))

答案 2 :(得分:0)

虽然subprocess.Popen可能就像@jcollado所说的那样,但为了完整性,有os.system命令立即向shell发送命令。但是,子进程模块几乎总是比os.system或os.spawn更好的选择。

此外,根据您尝试执行的操作,您可能希望使用python命令与操作系统进行交互,而不是将命令传递给shell。例如,如果你想处理文件列表,os.walk可能会产生比通过shell命令获取目录列表更清晰,更可移植的代码。您可以查看Python的OS模块here的文档。

答案 3 :(得分:0)

根据您想要完成的任务,这可能是更好的方式:

In [50]:  %alias x ls -la %l


In [51]:  x *.rar

          -rw-r--r-- 1 dubbaluga users 45254 Apr  4 15:12 schoolbus.rar

答案 4 :(得分:0)

在这种情况下,使用Python可能更容易:

import glob

files = glob.glob('*.rar')