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

从交互式IPython shell中的函数调用shell命令,python,function,shell,ipython,Python,Function,Shell,Ipython,我只是在和伊皮顿玩。目前,我想知道如何在函数中使用python变量运行shell命令。例如: def x(go): return !ls -la {go} x("*.rar") 这给了我“sh:1:语法错误:意外的文件结尾”。有谁能给我一个关于如何让我的“x”函数像“ls-la*.rar”一样调用ls的线索吗?我的工作目录中有*.rar文件 提前谢谢大家,, Rainer如果查看历史记录命令输出,您将看到调用外部程序ipython使用\u ip.system方法 因此,这应该适用于您

我只是在和伊皮顿玩。目前,我想知道如何在函数中使用python变量运行shell命令。例如:

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

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

提前谢谢大家,,
Rainer

如果查看
历史记录
命令输出,您将看到调用外部程序ipython使用
\u ip.system
方法

因此,这应该适用于您:

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

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

而subprocess.Popen可能是一种方法,正如@jcollado所说的,只是为了完整起见,有一个os.system命令可以立即向shell发送命令。但是,子流程模块几乎总是比os.system或os.spawn更好的选择


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

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

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


In [51]:  x *.rar

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

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

import glob

files = glob.glob('*.rar')   
“!”shell访问中存在一个错误,导致“函数作用域变量”的扩展失败。您的ipython版本可能会受到影响

您可以通过自己进行变量展开来避免:

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

您好,谢谢您的快速回复!我只是尝试了一下,发现“\u ip”需要通过“\u ip=get\u ipython()”来获取。然而,实际上这并没有解析“ls”的输出。我想我会继续使用subprocess.Popen(),遗憾的是,它不如IPython中的“!”方便。干杯,雷尼尔如果您将系统命令的结果分配给变量
files=!ls-la
,它被翻译成
文件=get_ipython().getoutput('ls-la foo')
@jcollado:
子流程。对于类似的东西,Popen
可能是杀伤力过大了。查看模块级函数,如
子流程。检查输出: