2017-03-28 67 views
0

我有一个Python代码段是这样的:蟒子POPEN返回None

self.task = subprocess.Popen("bash ./FOLDER/script.sh", cwd=some_dir, shell=True) 
self.task.wait() 

从其中将引发一个例外,抱怨一个“NoneType”对象没有方法等待()。我想这意味着Popen调用返回None?这可能是什么原因。该文件没有提到这种可能性

我使用python 2.7.13

回答

1

嗯,显然self.task给人以NoneType respons意味着subprocess.Popen()的命令可能会出现故障。

我注意到的第一件事是一个不正确的语法,因为你没有用方括号[]包装你的命令行,你没有分割参数。

此外,Python文档状态(关于你使用的CWD选项):

如果CWD不是无,孩子的当前目录会在执行之前把它改成 CWD。请注意,在搜索可执行文件时,此目录不被视为 ,因此您无法指定相对于cwd的程序路径 。

所以首先要检查的是,如果您的script.sh位于some_dir/FOLDER/script.sh

如果确实如此,请检查是否用正确的语法插入了cwd参数,如字符串。含义cwd="/path/to/some/dir"

然后,由于Python文档明确指出:

使用shell =真可以是一个安全隐患

我会删除这样的说法。这可能意味着你将不得不使用你的bash的完整路径。要找出正确的路径,请打开一个终端并执行which bash。或者,可以肯定的是,type bash

然后,试试这个:

import subprocess 

self.task = subprocess.Popen(["/path/to/your/bash", "./FOLDER/script.sh"], cwd="/path/to/some_dir", stdout=subprocess.PIPE, stderr=subprocess.PIPE) # This makes sure you will also catch any standard errors, so it allows for a bit more control. 
output, errors = self.task.communicate() # This already encapsulates .wait() 
print(output.decode()) # if you'd like to check the output. 

阅读一些进一步的解释代码中的注释..

+0

其实有代码错误和'等待()'被称为另一个var比'self.task',就像错误说的那样。我接受你的答案,因为我从中学到了2-3件事,谢谢 –