2017-01-05 5 views
0

Я пытаюсь запустить исполняемый файл на Линукс Max OS X 10.11.6 через python2.7Как Python команду subprocess.check_output Линукс на Mac OS

Я хотел бы использовать subprocess.check_output.

Команда, которая работает с помощью терминала:

mosel -c "exec PATH/TO/SCRIPT arg1='value1', arg2='value2'" 

Однако, когда я пытаюсь:

subprocess.check_output(['mosel','-c',cmd]) 

где

cmd="exec PATH/TO/SCRIPT arg1='value1', arg2='value2'"' 

я получаю:

File "/usr/local/lib/python2.7/site-packages/subprocess32.py", line 629, in check_output 
process = Popen(stdout=PIPE, *popenargs, **kwargs) 
File "/usr/local/lib/python2.7/site-packages/subprocess32.py", line 825, in __init__ 
restore_signals, start_new_session) 
File "/usr/local/lib/python2.7/site-packages/subprocess32.py", line 1574, in _execute_child 
raise child_exception_type(errno_num, err_msg) 
OSError: [Errno 2] No such file or directory: 'mosel' 

Я смог заставить его «эхо» команды в выходной файл, но я не могу запустить «какой mosel» через python, что заставляет меня думать, что это связано с check_output, используя «bin/sh» as исполняемый файл.

Итак, мне нужно использовать "POPEN" вместо и установить

executable=path/to/mosel 

?

Если да, то как использовать Python, чтобы получить путь пользователя к mosel (т. Е. Получить результат «какой mosel»)?

Спасибо!

UPDATE:

PyCharm не видел системные пути, которые я установил, используя этот ответ: Setting environment variables in OS X?

Теперь, кажется, что

subprocess.check_output(['mosel','-c',cmd]) 

Посылает квадратные скобки в командной строки, поскольку он теперь возвращает:

dyld: Library not loaded: libxprm_mc.dylib 
Referenced from: /usr/local/opt/xpress/bin/mosel 
Reason: image not found 
Traceback (most recent call last): 
File "/Users/nlaws/projects/sunlamp/sunlamp-ss/RunScenarios/run.py", line 70, in <module> 
run(1) 
File "/Users/nlaws/projects/sunlamp/sunlamp-ss/RunScenarios/run.py", line 44, in run 
out = check_output(['mosel', '-c', cmd]) 
File "/usr/local/Cellar/python/2.7.13/Frameworks/Python.framework/Versions/2.7/lib/python2.7/subprocess.py", line 219, in check_output 
raise CalledProcessError(retcode, cmd, output=output) 
subprocess.CalledProcessError: Command '['mosel', '-c', cmd]' returned non-zero exit status -5 

Или есть еще проблема? (Я могу запустить mosel -c cmd через терминал mac, но не в pycharm через python, ни в терминале mac через python).

+2

Когда 'shell = False', вы * имеете *, чтобы передать список строк. поэтому последний пример верен. Однако вы не указали никакой информации о том, что произошло в этом случае. – Bakuriu

+0

То же самое происходит с первым выходом –

+0

Ну, 'mosel' * неправильно установлен в вашей системе. Исправьте установку. – Bakuriu

ответ

0

Корень вопроса оказывается быть DYLD_LIBRARY_PATH:

The new OS X release 10.11 "El Capitan" has a "security" feature that prevents passing DYLD_LIBRARY_PATH to child processes. Somehow, that variable is stripped from the environment. - (quoted from https://www.postgresql.org/message-id/[email protected])

Функция безопасности называется SIP или «Защита целостности системы». К сожалению, кажется, что никто не придумал решение этой проблемы (кроме рабочих, которые должны быть адаптированы к каждой ситуации).

Вот еще один пример этого вопроса: https://github.com/soumith/cudnn.torch/issues/111

Google "Mac OS наследуют dyld_library_path", и вы найдете много других примеров.

0

Проблема: вы неправильно используете аргументы check_output. Если вы не передаёте shell=True, check_outputexpects a list of parameters as its input, в виде: check_call(['binary_name','arg1','arg2','arg3', ....])

Таким образом, в этом случае, вы должны сделать:

subprocess.check_call(['mosel', '-c', "exec PATH/TO/SCRIPT arg1='value1', arg2='value2'"]) 
+0

Этот метод приводит к: 'OSError: [Errno 2] Нет такого файла или каталога: 'mosel'' –

+0

@NickLaws, пожалуйста, обновите исходный вопрос с помощью результата этой формы, если вы это сделали, это будет яснее будущим читателям. – aruisdante