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

0 投票
2 回答
646 浏览
提问于 2025-04-16 08:55

我已经看过之前关于这个问题的提问,但我还是没搞明白。

我试着在命令行中运行一个命令,结果没有问题:

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 个回答

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

应该是对的。在这个命令中,'pwd'周围多了引号,这样会把它当成一个整体的参数,但这些引号实际上并不会被传递。既然你已经在分割参数了,就把多余的引号去掉吧。


显然(根据提问者的更新),ush是一个命令别名。所以它只在命令行中有效,其他地方用就不行。你需要自己展开它:

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

如果你系统里的 ush 是一个别名,那么 popen 就无法正常工作。因为 popen 需要一个可执行的文件作为第一个参数:这个文件要么是一个绝对路径,要么是你在系统环境变量 PATH 中能找到的文件名。

撰写回答