用Python获取bash输出
我想写一个简单的命令,让我可以在Python中完全运行bash,包括输出字符串。
这个功能在我工作时用的系统上运行得很好:
import subprocess
def run(command):
output = subprocess.check_output(command, shell=True)
return output
但是,现在我在家用的时候,PATH变量和我终端里的不一样。
所以当我执行
run('ls')
时,我得到了这个:
/bin/sh: ls: command not found
这很合理,因为,当我运行
print run('/usr/bin/env')
时得到的PATH是
PATH=/Library/Frameworks/Python.framework/Versions/Current/bin/
现在,我可以通过使用:
run('/bin/ls')
来解决这个问题,但这就失去了使用这个命令的意义,因为我想要忠实地模拟bash
shell。
我该如何让run()使用系统的PATH,或者创建一个等效的函数,让它正常工作呢?
(请不要说使用'shell=True'
的危险。这些都是个人使用,命令也很简单,比如ls
和ps axw
。)
1 个回答
1
我把这个问题留着,因为我觉得上面的 run()
命令很有用,而在StackOverflow上找不到类似的内容。
不过,我的解决方案是针对特定系统的。问题是,我在Sublime Text 2中运行这个脚本,并且手动把 Python.sublime-settings
中的路径替换成了
"path": "/Library/Frameworks/Python.framework/Versions/Current/bin/",
我这么做是因为我之前遇到过让ST2找到正确的 python
版本的问题。结果,这样做还覆盖了ST2中的系统级PATH变量,导致我无法访问一些简单的命令行程序,比如 ls
。
把 Python.sublime-settings
中的 "path": ...
这一行删掉后,我的问题就解决了。
编辑
正如 mklement0 所建议的,把这一行改成 追加 路径也可以解决问题:
"path": "$PATH:/Library/Frameworks/Python.framework/Versions/Current/bin/",