用Python获取bash输出

1 投票
1 回答
2315 浏览
提问于 2025-04-18 03:30

我想写一个简单的命令,让我可以在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'的危险。这些都是个人使用,命令也很简单,比如lsps 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/",

撰写回答