使用子进程从Python包运行rabbitmqctl会返回“未找到命令”。
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,但最终得到了同样的错误。
发布于 2020-07-06 21:22:56
这个问题是由于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无法在路径中找到这些依赖的命令,因为这些命令的位置不是虚拟环境路径的一部分。因此,请确保将所有与rabbitmqctl相关的命令的位置添加到上面的rabbit_env‘’PATH‘中。
https://stackoverflow.com/questions/62716085
复制相似问题