Popen无法处理在shell中运行的命令
我已经看过之前关于这个问题的提问,但我还是没搞明白。
我试着在命令行中运行一个命令,结果没有问题:
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 中能找到的文件名。