pymqi连接在osx子进程中失败,异常导致python shell终止

-1 投票
1 回答
49 浏览
提问于 2025-04-13 18:04

在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这个环境变量。

想看看这个是怎么回事,可以按照以下步骤操作:

  1. 打开终端
  2. 输入 echo $DYLD_LIBRARY_PATH 并按回车
  3. 输入 bash 并按回车
  4. 再输入 echo $DYLD_LIBRARY_PATH 并按回车

DYLD_LIBRARY_PATH 需要被设置好,以便能够找到MQ客户端运行时需要的动态库,这些库默认是在 /opt/mqm/lib64 这个路径下。

撰写回答