9
9
Requires Packages to be installed
10
10
"""
11
11
from __future__ import print_function , division , unicode_literals , absolute_import
12
- from future import standard_library
13
- standard_library . install_aliases ()
12
+ import gc
13
+
14
14
from builtins import range , object , open , str , bytes
15
15
16
- from configparser import NoOptionError
17
16
from copy import deepcopy
18
17
import datetime
19
18
from datetime import datetime as dt
26
25
import select
27
26
import subprocess as sp
28
27
import sys
29
- import time
30
28
from textwrap import wrap
31
29
from warnings import warn
32
30
import simplejson as json
43
41
traits , Undefined , TraitDictObject , TraitListObject , TraitError , isdefined ,
44
42
File , Directory , DictStrStr , has_metadata , ImageFile )
45
43
from ..external .due import due
44
+ from future import standard_library
45
+ standard_library .install_aliases ()
46
46
47
47
nipype_version = Version (__version__ )
48
48
iflogger = logging .getLogger ('interface' )
58
58
class Str (traits .Unicode ):
59
59
"""Replacement for the default traits.Str based in bytes"""
60
60
61
+
61
62
traits .Str = Str
62
63
63
64
@@ -1260,6 +1261,7 @@ class SimpleInterface(BaseInterface):
1260
1261
>>> os.chdir(old.strpath)
1261
1262
1262
1263
"""
1264
+
1263
1265
def __init__ (self , from_file = None , resource_monitor = None , ** inputs ):
1264
1266
super (SimpleInterface , self ).__init__ (
1265
1267
from_file = from_file , resource_monitor = resource_monitor , ** inputs )
@@ -1387,8 +1389,7 @@ def run_command(runtime, output=None, timeout=0.01):
1387
1389
shell = True ,
1388
1390
cwd = runtime .cwd ,
1389
1391
env = env ,
1390
- close_fds = True ,
1391
- )
1392
+ close_fds = True )
1392
1393
result = {
1393
1394
'stdout' : [],
1394
1395
'stderr' : [],
@@ -1427,37 +1428,50 @@ def _process(drain=0):
1427
1428
temp .sort ()
1428
1429
result ['merged' ] = [r [1 ] for r in temp ]
1429
1430
1430
- if output == 'allatonce' :
1431
- stdout , stderr = proc .communicate ()
1432
- result ['stdout' ] = read_stream (stdout , logger = iflogger )
1433
- result ['stderr' ] = read_stream (stderr , logger = iflogger )
1434
-
1435
- elif output .startswith ('file' ):
1431
+ if output .startswith ('file' ):
1436
1432
proc .wait ()
1437
1433
if outfile is not None :
1438
1434
stdout .flush ()
1439
1435
stdout .close ()
1440
1436
with open (outfile , 'rb' ) as ofh :
1441
1437
stdoutstr = ofh .read ()
1442
1438
result ['stdout' ] = read_stream (stdoutstr , logger = iflogger )
1439
+ del stdoutstr
1443
1440
1444
1441
if errfile is not None :
1445
1442
stderr .flush ()
1446
1443
stderr .close ()
1447
1444
with open (errfile , 'rb' ) as efh :
1448
1445
stderrstr = efh .read ()
1449
1446
result ['stderr' ] = read_stream (stderrstr , logger = iflogger )
1447
+ del stderrstr
1450
1448
1451
1449
if output == 'file' :
1452
1450
result ['merged' ] = result ['stdout' ]
1453
1451
result ['stdout' ] = []
1454
1452
else :
1455
- proc .communicate () # Discard stdout and stderr
1453
+ stdout , stderr = proc .communicate ()
1454
+ if output == 'allatonce' : # Discard stdout and stderr otherwise
1455
+ result ['stdout' ] = read_stream (stdout , logger = iflogger )
1456
+ result ['stderr' ] = read_stream (stderr , logger = iflogger )
1457
+
1458
+ runtime .returncode = proc .returncode
1459
+ try :
1460
+ proc .terminate () # Ensure we are done
1461
+ except OSError as error :
1462
+ # Python 2 raises when the process is already gone
1463
+ if error .errno != errno .ESRCH :
1464
+ raise
1465
+
1466
+ # Dereference & force GC for a cleanup
1467
+ del proc
1468
+ del stdout
1469
+ del stderr
1470
+ gc .collect ()
1456
1471
1457
1472
runtime .stderr = '\n ' .join (result ['stderr' ])
1458
1473
runtime .stdout = '\n ' .join (result ['stdout' ])
1459
1474
runtime .merged = '\n ' .join (result ['merged' ])
1460
- runtime .returncode = proc .returncode
1461
1475
return runtime
1462
1476
1463
1477
@@ -1467,21 +1481,26 @@ def get_dependencies(name, environ):
1467
1481
Uses otool on darwin, ldd on linux. Currently doesn't support windows.
1468
1482
1469
1483
"""
1484
+ cmd = None
1470
1485
if sys .platform == 'darwin' :
1471
- proc = sp .Popen ('otool -L `which %s`' % name ,
1472
- stdout = sp .PIPE ,
1473
- stderr = sp .PIPE ,
1474
- shell = True ,
1475
- env = environ )
1486
+ cmd = 'otool -L `which {}`' .format
1476
1487
elif 'linux' in sys .platform :
1477
- proc = sp .Popen ('ldd `which %s`' % name ,
1478
- stdout = sp .PIPE ,
1479
- stderr = sp .PIPE ,
1480
- shell = True ,
1481
- env = environ )
1482
- else :
1488
+ cmd = 'ldd -L `which {}`' .format
1489
+
1490
+ if cmd is None :
1483
1491
return 'Platform %s not supported' % sys .platform
1484
- o , e = proc .communicate ()
1492
+
1493
+ try :
1494
+ proc = sp .Popen (
1495
+ cmd (name ), stdout = sp .PIPE , stderr = sp .PIPE , shell = True ,
1496
+ env = environ , close_fds = True )
1497
+ o , _ = proc .communicate ()
1498
+ proc .terminate ()
1499
+ gc .collect ()
1500
+ except :
1501
+ iflogger .warning (
1502
+ 'Could not get linked libraries for "%s".' , name )
1503
+ return 'Failed collecting dependencies'
1485
1504
return o .rstrip ()
1486
1505
1487
1506
@@ -1572,6 +1591,9 @@ def __init__(self, command=None, terminal_output=None, **inputs):
1572
1591
# Set command. Input argument takes precedence
1573
1592
self ._cmd = command or getattr (self , '_cmd' , None )
1574
1593
1594
+ # Store dependencies in runtime object
1595
+ self ._ldd = str2bool (config .get ('execution' , 'get_linked_libs' , 'true' ))
1596
+
1575
1597
if self ._cmd is None :
1576
1598
raise Exception ("Missing command" )
1577
1599
@@ -1620,6 +1642,8 @@ def _get_environ(self):
1620
1642
return getattr (self .inputs , 'environ' , {})
1621
1643
1622
1644
def version_from_command (self , flag = '-v' ):
1645
+ iflogger .warning ('version_from_command member of CommandLine was '
1646
+ 'Deprecated in nipype-1.0.0 and deleted in 1.1.0' )
1623
1647
cmdname = self .cmd .split ()[0 ]
1624
1648
env = dict (os .environ )
1625
1649
if _exists_in_path (cmdname , env ):
@@ -1664,7 +1688,8 @@ def _run_interface(self, runtime, correct_return_codes=(0,)):
1664
1688
(self .cmd .split ()[0 ], runtime .hostname ))
1665
1689
1666
1690
runtime .command_path = cmd_path
1667
- runtime .dependencies = get_dependencies (executable_name , runtime .environ )
1691
+ runtime .dependencies = (get_dependencies (executable_name , runtime .environ )
1692
+ if self ._ldd else '<skipped>' )
1668
1693
runtime = run_command (runtime , output = self .terminal_output )
1669
1694
if runtime .returncode is None or \
1670
1695
runtime .returncode not in correct_return_codes :
0 commit comments