我刚刚玩过IPython。目前我想知道如何在函数中运行带有python变量的shell命令。例如:
def x(go):
return !ls -la {go}
x("*.rar")
这给了我“sh:1:语法错误:文件结束意外”。有人可以给我一个关于如何让我的“x”函数调用ls -la * .rar“的线索吗?我的工作目录中有* .rar文件。
提前谢谢你, 赖
答案 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')