可以将文章内容翻译成中文,广告屏蔽插件可能会导致该功能失效(如失效,请关闭广告屏蔽插件后再试):
问题:
I am using subprocess to call another program and save its return values to a variable. This process is repeated in a loop, and after a few thousands times the program crashed with the following error:
Traceback (most recent call last):
File "./extract_pcgls.py", line 96, in <module>
SelfE.append( CalSelfEnergy(i) )
File "./extract_pcgls.py", line 59, in CalSelfEnergy
p = subprocess.Popen(cmd, stdout=subprocess.PIPE, shell=True)
File "/usr/lib/python3.2/subprocess.py", line 745, in __init__
restore_signals, start_new_session)
File "/usr/lib/python3.2/subprocess.py", line 1166, in _execute_child
errpipe_read, errpipe_write = _create_pipe()
OSError: [Errno 24] Too many open files
Any idea how to solve this issue is much appreciated!
Code supplied from comments:
cmd = "enerCHARMM.pl -parram=x,xtop=topology_modified.rtf,xpar=lipid27_modified.par,nobuildall -out vdwaals {0}".format(cmtup[1])
p = subprocess.Popen(cmd, stdout=subprocess.PIPE, shell=True)
out, err = p.communicate()
回答1:
In Mac OSX (El Capitan) See current configuration:
#ulimit -a
core file size (blocks, -c) 0
data seg size (kbytes, -d) unlimited
file size (blocks, -f) unlimited
max locked memory (kbytes, -l) unlimited
max memory size (kbytes, -m) unlimited
open files (-n) 256
pipe size (512 bytes, -p) 1
stack size (kbytes, -s) 8192
cpu time (seconds, -t) unlimited
max user processes (-u) 709
virtual memory (kbytes, -v) unlimited
Set open files value to 10K :
#ulimit -Sn 10000
Verify results:
#ulimit -a
core file size (blocks, -c) 0
data seg size (kbytes, -d) unlimited
file size (blocks, -f) unlimited
max locked memory (kbytes, -l) unlimited
max memory size (kbytes, -m) unlimited
open files (-n) 10000
pipe size (512 bytes, -p) 1
stack size (kbytes, -s) 8192
cpu time (seconds, -t) unlimited
max user processes (-u) 709
virtual memory (kbytes, -v) unlimited
回答2:
I guess the problem was due to the fact that I was processing an open file with subprocess:
cmd = "enerCHARMM.pl -par param=x,xtop=topology_modified.rtf,xpar=lipid27_modified.par,nobuildall -out vdwaals {0}".format(cmtup[1])
p = subprocess.Popen(cmd, stdout=subprocess.PIPE, shell=True)
Here the cmd variable contain the name of a file that has just been created but not closed. Then the subprocess.Popen
calls a system command on that file. After doing this for many times, the program crashed with that error message.
So the message I learned from this is
Close the file you have created, then process it
Thanks
回答3:
You can try raising the open file limit of the OS:
ulimit -n 2048
回答4:
A child process created by Popen()
may inherit open file descriptors (a finite resource) from the parent. Use close_fds=True
on POSIX (default since Python 3.2), to avoid it. Also, "PEP 0446 -- Make newly created file descriptors non-inheritable" deals with some remaining issues (since Python 3.4).
回答5:
As others have noted, raise the limit in /etc/security/limits.conf and also file descriptors was an issue for me personally, so I did
sudo sysctl -w fs.file-max=100000
And added a line with fs.file-max = 100000 to /etc/sysctl.conf (reload with sysctl -p)
Also if you want to make sure that your process is not affected by anything else (which mine was), use
cat /proc/{process id}/limits
to find out what the actual limits of your process are, as for me the software running the python scripts also had its limits applied which have overridden the system wide settings.
Posting this answer here after resolving my particular issue with this error and hopefully it helps someone.
回答6:
Maybe you are invoking the command multiple times. If so, each time you're doing stdout=subprocess.PIPE
. Between each call try doing p.stdout.close()
.
回答7:
opens file in subprocess. It is blocking call.
ss=subprocess.Popen(tempFileName,shell=True)
ss.communicate()