Popen无法处理在shell中运行的命令

时间:2010-12-22 17:50:32

标签: python subprocess popen

我已经阅读过相同论点上发布的上述问题,但我还没有想出来。

我正在尝试运行一个在命令行中没有问题的命令:

xyz@klm:~/python-remoteWorkspace/PyLogParser/src:18:43>ush -o PPP -p PRD -n log 'pwd'
6:43PM PPP:prd:lgsprdppp:/ama/log/PRD/ppp

但是当我在python中做同样的事情时,我总是会遇到错误:

stringa = Popen(["ush -o PPP -p PRD -n log 'pwd'"], stdout=PIPE, stdin=PIPE).communicate()[0]

这是错误。

Traceback (most recent call last):   File "getStatData.py", line 134, in <module>
    retrieveListOfFiles(infoToRetList)   File "getStatData.py", line 120, in retrieveListOfFiles
    stringa = Popen(["ush -o PPP -p PRD -n log 'pwd'"], stdout=PIPE, stdin=PIPE).communicate()[0]   File "/opt/python-2.6-64/lib/python2.6/subprocess.py", line 595, in __init__
    errread, errwrite)   File "/opt/python-2.6-64/lib/python2.6/subprocess.py", line 1092, in _execute_child
    raise child_exception OSError: [Errno 2] No such file or directory

我也试过了不同的解决方案,比如

stringa = Popen(["ush", "-o", "PPP", "-p" "PRD", "-n", "log", '"pwd"'], stdout=PIPE, stdin=PIPE).communicate()[0]

但似乎没有任何效果。我也试图把绝对的道路放到ush但没有...... 有人可以解释一下我做错了什么吗?

提前致谢,AM。

编辑: 当我做的时候,我发生了一件奇怪的事情

which ush

我得到了

ush: aliased to nocorrect /projects/aaaaaaa/local/ush/latest/ush.py

但为什么它会起作用?

!!!谢谢大家的答案!

2 个答案:

答案 0 :(得分:2)

Popen(["ush", "-o", "PPP", "-p", "PRD", "-n", "log", "pwd"])

应该是对的。 shell命令中'pwd'周围的额外引用使它成为一个参数,但引号实际上并未传递。由于您已经拆分了参数,因此请保留额外的引号。


显然(在OP的更新中)ush是shell别名。因此,它只在外壳中扩展;在其他任何地方,它都行不通。自己展开:

Popen(["nocorrect", "/projects/aaaaaaa/local/ush/latest/ush.py",
       "-o", "PPP", "-p", "PRD", "-n", "log", "pwd"])

答案 1 :(得分:1)

如果您系统上的ush是别名,则popen将无效。 popen需要一个可执行文件作为第一个参数:绝对路径或PATH中的某些东西的名称。