我有一个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
我有一个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
嗯,显然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.
阅读一些进一步的解释代码中的注释..
其实有代码错误和'等待()'被称为另一个var比'self.task',就像错误说的那样。我接受你的答案,因为我从中学到了2-3件事,谢谢 –