pymqi连接在osx子进程中失败,异常导致python shell终止
在Linux系统上,下面这两条命令都能正常工作:
$ python -c "import pymqi; pymqi.connect('QM1', 'DEV.APP.SVRCONN', 'localhost(1414)', user='xxx', password='xxx')" # command 1
$ bash -c "python -c \"import pymqi; pymqi.connect('QM1', 'DEV.APP.SVRCONN', 'localhost(1414)', user='xxx', password='xxx')\"" # command 2
在OSX系统上,第一条命令成功了,而第二条命令失败了,输出了这个信息:
TENDTraceback (most recent call last):
File "<string>", line 1, in <module>
File "/Users/wolfson/.local/share/virtualenvs/xxx-xWWWLtqs/lib/python3.11/site-packages/pymqi/__init__.py", line 3214, in connect
qmgr.connect_tcp_client(queue_manager or '', CD(), channel, conn_info, user, password)
File "/Users/wolfson/.local/share/virtualenvs/xxx-xWWWLtqs/lib/python3.11/site-packages/pymqi/__init__.py", line 1772, in connect_tcp_client
self.connect_with_options(name, **kwargs)
File "/Users/wolfson/.local/share/virtualenvs/xxx-xWWWLtqs/lib/python3.11/site-packages/pymqi/__init__.py", line 1747, in connect_with_options
raise MQMIError(rv[1], rv[2])
pymqi.MQMIError: MQI Error. Comp: 2, Reason 2009: FAILED: MQRC_CONNECTION_BROKEN
(注意在Traceback
前面有个奇怪的TEND
前缀。真奇怪!)
不仅如此,如果我直接运行bash -c python
,然后在Python环境中执行import pymqi; pymqi.connect('QM1', 'DEV.APP.SVRCONN', 'localhost(1414)', user='xxx', password='xxx')
,我也会遇到同样的错误,而且Python进程会直接退出。
在运行/opt/mqm/samp/bin/
中的示例程序时,这种情况似乎不会发生。
我猜这可能和OSX的某些设置有关,但……到底是什么呢?有没有解决办法?
补充:这和DYLD_LIBRARY_PATH
没有关系。也没有出现嵌套构建时的错误:
% bash -c "pipenv run pip install pymqi"
Requirement already satisfied: pymqi in /Users/wolfson/.local/share/virtualenvs/xxx-xWWWLtqs/lib/python3.11/site-packages (1.12.10)
而且在嵌套的shell中,显然可以导入pymqi.pymqe
。
1 个回答
-1
这是因为macOS有一个叫做系统完整性保护的功能。某些可执行文件(包括脚本)不会继承DYLD_LIBRARY_PATH这个环境变量。
想看看这个是怎么回事,可以按照以下步骤操作:
- 打开终端
- 输入
echo $DYLD_LIBRARY_PATH
并按回车 - 输入
bash
并按回车 - 再输入
echo $DYLD_LIBRARY_PATH
并按回车
DYLD_LIBRARY_PATH
需要被设置好,以便能够找到MQ客户端运行时需要的动态库,这些库默认是在 /opt/mqm/lib64
这个路径下。