подпроцесс зависает при poller.poll()

#python #matlab #nipype

#питон #matlab #nipype ( тип nipype ) #python #nipype

Вопрос:

Я пытаюсь запустить простой интерфейс matlab на Nipype, как показано ниже, но почему-то он застревает в коде run(). Моя командная строка больше не выполняется. Но это работает отлично, если я копирую mlab.cmdline (matlab -nodesktop -nosplash -singleCompThread -r «addpath(‘/somepath’);pyscript;exit») и передаю его в командную строку.

 import nipype.interfaces.matlab as matlab

mlab = matlab.MatlabCommand()
mlab.inputs.script = """ 1 2 """

print mlab.cmdline
res = mlab.run()

print res.runtime
  

вот прерывание работы клавиатуры ipython :

     ^C---------------------------------------------------------------------------
KeyboardInterrupt                         Traceback (most recent call last)
/usr/lib/python2.7/dist-packages/IPython/utils/py3compat.pyc in execfile(fname, *where)
    173             else:
    174                 filename = fname
--> 175             __builtin__.execfile(filename, *where)

/new_home/intern2012/yasin/example.py in <module>()
      6
      7 print mlab.cmdline
----> 8 res = mlab.run()
      9
     10 print res.runtime

/usr/lib/pymodules/python2.7/nipype/interfaces/base.pyc in run(self, **inputs)
    944                         version=self.version)
    945         try:
--> 946             runtime = self._run_interface(runtime)
    947             outputs = self.aggregate_outputs(runtime)
    948             runtime.endTime = dt.isoformat(dt.utcnow())

/usr/lib/pymodules/python2.7/nipype/interfaces/matlab.pyc in _run_interface(self, runtime)
    136     def _run_interface(self,runtime):
    137         self.inputs.terminal_output = 'allatonce'
--> 138         runtime = super(MatlabCommand, self)._run_interface(runtime)
    139         try:
    140             # Matlab can leave the terminal in a barbbled state


/usr/lib/pymodules/python2.7/nipype/interfaces/base.pyc in _run_interface(self, runtime, correct_return_codes)
   1378         setattr(runtime, 'dependencies', get_dependencies(executable_name,
   1379                                                           runtime.environ))
-> 1380         runtime = run_command(runtime, output=self.inputs.terminal_output)
   1381         if runtime.returncode is None or 
   1382                         runtime.returncode not in correct_return_codes:

/usr/lib/pymodules/python2.7/nipype/interfaces/base.pyc in run_command(runtime, output, timeout)
   1150         result['merged'] = [r[1] for r in temp]
   1151     if output == 'allatonce':
-> 1152         stdout, stderr = proc.communicate()
   1153         result['stdout'] = stdout.split('n')
   1154         result['stderr'] = stderr.split('n')

/usr/lib/python2.7/subprocess.pyc in communicate(self, input)
    752             return (stdout, stderr)
    753
--> 754         return self._communicate(input)
    755
    756

/usr/lib/python2.7/subprocess.pyc in _communicate(self, input)
   1310
   1311             if _has_poll:
-> 1312                 stdout, stderr = self._communicate_with_poll(input)
   1313             else:
   1314                 stdout, stderr = self._communicate_with_select(input)

/usr/lib/python2.7/subprocess.pyc in _communicate_with_poll(self, input)
   1364             while fd2file:
   1365                 try:
-> 1366                     ready = poller.poll()
   1367                 except select.error, e:
   1368                     if e.args[0] == errno.EINTR:
  

Я читал другие subprocess проблемы на этом сайте, но все они связаны с Popen() . В моем случае что-то не так с poller.poll() . Он больше не обрабатывается, когда достигает этой строки.

Комментарии:

1. Как вы думаете, может ли это иметь какое-то отношение к тому, что matlab — это только один поток?

2. Я не думаю, что проблема связана с matlab. На самом деле, тот же код работает на моем Mac. Я думаю, проблема в компьютере, который я использую на сервере. Почему-то это никак не может завершиться _communicate_with_poll .

Ответ №1:

Мне не удалось воспроизвести это поведение (оно же «работает для меня!»). Какую версию nipype вы используете?

Комментарии:

1. ‘{‘nibabel_version’: ‘1.3.0’, ‘networkx_version’: ‘1.6’, ‘numpy_version’: ‘1.6.1’, ‘sys_platform’: ‘linux2’, ‘sys_version’: ‘2.7.3 (по умолчанию, сентябрь 26 2013, 20:03:06) n[GCC 4.6.3]’, ‘commit_source’: ‘замена архива’, ‘commit_hash’: ‘162f65d’, ‘pkg_path’: ‘/usr/lib/pymodules/python2.7/nipype’, ‘sys_executable’: ‘/usr/bin/python’, ‘traits_version’: ‘4.0.0’, ‘scipy_version’: ‘ 0.9.0′}’

2. Я только что переустановил nipype сейчас, но снова та же проблема. Что-то не так в poller.poll() . Даже этот застревает : python -c "import nipype; nipype.test()" . Точно в том же месте.

3. nipype.__version__ ? можете ли вы запустить что-нибудь с помощью Popen?

4. Пока я не использую sever, но это должна быть последняя версия, потому что я только что переустановил ее сегодня с помощью NeuroDebian. Я могу без каких-либо проблем использовать Popen и Gzip-код ( ссылка ) . Но не может вызвать matlab, mipav или даже простейший код в командной строке. Он всегда получает сбои. Я даже пытался запустить код с учетной записью администратора. Это работает на моем Mac, но не на ubuntu. Я думаю, что что-то не так в base.py например, родительская функция ожидает дочернего процесса, и он застревает.

5. >>> nipype.__version__ ‘0.9.1’