我试图创建一个简单的命令,让我在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
这是有道理的,因为,无意义地,我从运行
获得的PATHprint run('/usr/bin/env')
是
PATH=/Library/Frameworks/Python.framework/Versions/Current/bin/
现在,我可以通过使用:
来解决所有这些问题run('/bin/ls')
但这违背了使用此命令的全部目的,即忠实地模拟bash
shell。
如何让run()使用系统的PATH或创建一个适用的等效函数?
(关于使用'shell=True'
的危险,请不要陈词滥调。这是个人使用的无关命令,如ls
和ps axw
。)
答案 0 :(得分:1)
我离开了这个问题,因为我认为上面的run()
命令很有用,我在SO上找不到类似的东西。
但是,我的解决方案非常符合系统。问题是,我在Sublime Text 2中运行此脚本并手动替换了Python.sublime-settings
中的路径
"path": "/Library/Frameworks/Python.framework/Versions/Current/bin/",
我这样做是因为我在找到正确版本的python
时遇到了问题。好吧,这也会覆盖ST2中的系统范围的PATH变量,从而阻止我访问像ls
这样的简单shell程序。
从"path": ...
删除Python.sublime-settings
行解决了我的问题。
修改强>
作为suggested by mklement0,将行更改为追加路径也可以:
"path": "$PATH:/Library/Frameworks/Python.framework/Versions/Current/bin/",