如何在mac os

时间:2017-01-05 16:47:46

标签: python linux subprocess

我试图通过python2.7

在Max OS X 10.11.6上运行linux可执行文件

我想使用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"作为可执行文件。

那么,我需要使用" Popen"而是设置

executable=path/to/mosel

如果是这样,如何使用Python来获取用户通往mosel的路径(即获得&#34的输出;哪个mosel")?

谢谢!

更新:

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

或者还有路径问题吗?! (我可以通过mac终端运行mosel -c cmd,但不能通过python运行pycharm,也不能通过python运行mac终端。)

2 个答案:

答案 0 :(得分:0)

问题是您未正确使用check_output的参数。除非您以下列形式传递shell=Truecheck_output expects a list of parameters as its inputcheck_call(['binary_name','arg1','arg2','arg3', ....])

所以在这种情况下,你应该这样做:

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

答案 1 :(得分:0)

问题的根源是DYLD_LIBRARY_PATH

  

新的OS X版本10.11“El Capitan”具有“安全”功能   阻止将DYLD_LIBRARY_PATH传递给子进程。不知何故,那   变量从环境中剥离。 - (引自https://www.postgresql.org/message-id/20151103113612.GW11897@awork2.anarazel.de

安全功能称为SIP或“系统完整性保护”。不幸的是,似乎没有人提出解决这个问题的方法(除了必须根据每种情况量身定做的解决办法)。

以下是此问题的另一个示例: https://github.com/soumith/cudnn.torch/issues/111

Google“mac os继承dyld_library_path”,您会发现许多其他示例。