首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使用python子进程运行rabbitmqctl命令?

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

Stack Overflow用户
提问于 2020-07-03 21:05:23
回答 1查看 69关注 0票数 1

使用子进程从Python包运行rabbitmqctl会返回“未找到命令”。

代码语言:javascript
复制
proc = subprocess.Popen(['/path/to/rabbitmqctl', 'arguments'], stdout=subprocess.PIPE)
output = proc.communicate()[0]
rt = proc.returncode

上面的代码是python项目的一部分,它将被打包到一个轮子发行版中。通过pip安装轮子后,上面的代码返回一个退出代码127,它是“没有找到命令”。

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

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

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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-07-06 21:22:56

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

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

代码语言:javascript
复制
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无法在路径中找到这些依赖的命令,因为这些命令的位置不是虚拟环境路径的一部分。因此,请确保将所有与rabbitmqctl相关的命令的位置添加到上面的rabbit_env‘’PATH‘中。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/62716085

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档