如何使用 python 子进程 运行 rabbitmqctl 命令?

How to run rabbitmqctl commands using python subprocess?

运行 rabbitmqctl 来自 Python 包使用子进程 returns “未找到命令”。

proc = subprocess.Popen(['/path/to/rabbitmqctl', 'arguments'], stdout=subprocess.PIPE)
output = proc.communicate()[0]
rt = proc.returncode

以上代码是 python 项目的一部分,该项目将被打包到一个 wheel 发行版中。通过 pip 安装 wheel 后,上面的代码 returns 退出代码 127,即“找不到命令”。

我尝试使用 rabbitmqctl 的完整路径,在命令中使用 sudo,在子进程中使用 preexec_fn 并将 uid 设置为 rabbitmq 用户,但所有内容 returns 返回代码 127。

该命令在 python 解释器中执行良好。仅当代码作为软件包安装时才会出现问题。

此代码是由 gunicorn 控制的 flask 应用程序的一部分。我什至尝试用 sudo 启动 gunicorn,但最终得到了同样的错误。

问题是由于 python 虚拟环境造成的。

我在 python 虚拟环境中安装了包含 rabbitmqctl 命令的软件包。因此,即使该模块具有 root 权限,它也无法找到 rabbitmqctl 命令,因为该二进制文件的路径不是虚拟环境的 PATH 环境变量的一部分。我通过在子进程中添加 env 参数来修复它。

rabbit_env = os.environ.copy()
rabbit_env['PATH'] = '/path/where/rabbitmqctl/is/located/:' + rabbit_env['PATH']
proc = subprocess.Popen(['/path/to/rabbitmqctl', 'arguments'], env=rabbit_env, stdout=subprocess.PIPE)
output = proc.communicate()[0]
rt = proc.returncode

即使我指定了 rabbitmqctl 的完整路径,我得到退出代码 127 的原因是因为 rabbitmqctl 是一个运行一些其他命令的脚本,而 rabbitmqctl 无法在 PATH 中找到那些依赖命令,因为这些命令' locations 不是虚拟环境 PATH 的一部分。因此,请确保在上面的 rabbit_env['PATH'] 中添加所有依赖 rabbitmqctl 的命令的位置。