it-swarm.com.de

Python Unterprozess: Zu viele offene Dateien

Ich benutze einen Unterprozess, um ein anderes Programm aufzurufen und dessen Rückgabewerte in einer Variablen zu speichern. Dieser Vorgang wird in einer Schleife wiederholt, und nach einigen tausend Versuchen stürzte das Programm mit folgendem Fehler ab:

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

Jede Idee, wie man dieses Problem löst, wird sehr geschätzt!

Code aus Kommentaren geliefert:

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()
37
Vahid Mirjalili

Ich vermute, das Problem lag an der Tatsache, dass ich eine offene Datei mit Subprozess verarbeitete:

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)

Hier enthält die Variable cmd den Namen einer Datei, die gerade erstellt, aber nicht geschlossen wurde. Dann ist die subprocess.Popen ruft einen Systembefehl für diese Datei auf. Nachdem dies viele Male getan wurde, stürzte das Programm mit dieser Fehlermeldung ab.

Die Botschaft, die ich daraus gelernt habe, ist

Schließen Sie die von Ihnen erstellte Datei und verarbeiten Sie sie

16
Vahid Mirjalili

Unter Mac OS X (El Capitan) Siehe aktuelle Konfiguration:

#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

Setze open files auf 10K:

#ulimit -Sn 10000

Ergebnisse überprüfen:

#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
26
user260826

Sie können versuchen, das Limit für offene Dateien des Betriebssystems zu erhöhen:

ulimit -n 2048

7
Matt Sweeney

Ein untergeordneter Prozess, der von Popen() erstellt wurde, erbt möglicherweise offene Dateideskriptoren (eine endliche Ressource) vom übergeordneten Prozess. Verwenden close_fds=True unter POSIX (Standardeinstellung seit Python 3.2), um dies zu vermeiden. "PEP 0446 - Neu erstellte Dateideskriptoren nicht vererbbar machen" behandelt einige verbleibende Ausgaben (seit Python 3.4) .

5
jfs

Möglicherweise rufen Sie den Befehl mehrmals auf. Wenn ja, jedes Mal, wenn Sie stdout=subprocess.PIPE Tun. Versuchen Sie zwischen jedem Aufruf, p.stdout.close() auszuführen.

2
Jyogo

öffnet die Datei im Unterprozess. Es blockiert den Anruf.

ss=subprocess.Popen(tempFileName,Shell=True)
 ss.communicate()
0
imp