2012-02-29 91 views
7

我想从python运行gphoto2,但没有成功。它只是返回命令未找到。 gphoto正确安装,因为在终端中的命令工作正常。Python子进程调用返回“命令未找到”,终端正确执行

p = subprocess.Popen(['gphoto2'], shell=True, stdout=subprocess.PIPE, 
    stderr=subprocess.STDOUT, executable='/bin/bash') 

for line in p.stdout.readlines(): 
    print line 
p.wait() 

/bin/bash: gphoto2: command not found 

我知道有一些有趣的关于OSX终端(应用程序),但是,我对OSX的知识是微薄的。

对此有何看法?

编辑

改变了我的一些代码,其他的错误使用完整路径 '的/ opt/local/bin目录/ gphoto2'

但如果出现

p = subprocess.Popen(['gphoto2'], stdout=subprocess.PIPE, stderr=subprocess.STDOUT) 
for line in p.stdout: 
    print line 


    raise child_exception 
OSError: [Errno 2] No such file or directory 

编辑

人小心解释使用哪个shell或如何登录并能够具有相同的功能..?

+1

你为什么不使用'subprocess.check_output() '或者一次输出整个东西? – Gandaro 2012-02-29 21:00:05

回答

7

当使用shell = True,第一个参数subprocess.Popen应该是一个字符串,而不是一个列表:

p = subprocess.Popen('gphoto2', shell=True, ...) 

但是,使用shell = True应尽量避免使用,因为它可以是一个security risk(见警告)。

所以改用

p = subprocess.Popen(['gphoto2'], ...) 

(当shell = False,或者如果省略shell参数,第一个参数应该是一个列表。)

+0

谢谢,重构我的代码正确知道。虽然它没有让我进一步。我编辑了我的帖子 – Aduen 2012-02-29 21:07:23

+3

如果使用'gphoto2'的完整路径,会发生什么? – unutbu 2012-02-29 21:15:55

+0

试图找到它,但如前所述,osx不是我的朋友... – Aduen 2012-02-29 22:07:14