2017-02-17 165 views
0

写一个非常简单的Python脚本ls我的项目目录的内容作为测试后:subprocess.Popen返回命令没有找到

from subprocess import * 
p = Popen(['ls /Users/Nelson/Projects'], stdout=PIPE, shell=True) 
print(p.communicate()[0].decode()) 

它踢出错误:

/bin/bash: ls: command not found 

我做了一些测试,发现基本命令pwd,echocd所有单词都很好,但不是ls。我尝试使用选项executable='/bin/bash',因为它默认为/bin/sh,但没有做任何事情。

此脚本已经在Ubuntu 14.04 LTS和Ubuntu 16.04 LTS上测试过,两者都正常工作。

我使用的是Mac OSX 10.12.3塞拉利昂如果这意味着在这种情况下

任何响应都非常感谢什么!

+0

根据记录,'pwd','echo'和' cd'都是'bash'内建的,而'ls'是一个独立的可执行程序,而不是内建的。这可能是行为差异的根源。 – ShadowRanger

回答

1

如果使用list调用,则需要自己拆分参数(而不是使用shell=True)。尝试:

Popen(['ls', '/Users/Nelson/Projects'], ... leave off shell=True ...) 

它将命令(ls)从唯一参数中分离出来。如果你有多个参数,它们也必须相互分离。

如果你坚持shell=True(一个可怕的想法大部分时间),不使用list,只是原始的字符串:

Popen('ls /Users/Nelson/Projects', ...) 
+0

非常感谢!我曾尝试过,没有输入命令为1字符串或2,以及有和没有shell = True。我想我错过了那个组合 – Nelson

+0

这是不真实的。你绝对可以将一个列表传递给'shell = True'。该列表的第一个元素被解析为一个shell脚本;后续的参数是该shell中的$ 0,$ 1等。 –