从交互式IPython shell中的函数调用shell命令
我只是在和伊皮顿玩。目前,我想知道如何在函数中使用python变量运行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方法 因此,这应该适用于您
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
可能是杀伤力过大了。查看模块级函数,如子流程。检查输出: