簡體   English   中英

如何使用 python 子進程運行 rabbitmqctl 命令?

[英]How to run rabbitmqctl commands using python subprocess?

使用子進程從 Python package 運行rabbitmqctl會返回“找不到命令”。

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

上面的代碼是 python 項目的一部分,該項目將被打包到一個輪子發行版中。 通過pip安裝輪子后,上述代碼返回退出碼127,即“command not found”。

我嘗試使用rabbitmqctl的完整路徑,在命令中使用sudo,在子進程中使用preexec_fn並將uid設置為rabbitmq用戶,但一切都返回返回碼127。

該命令在 python 解釋器中執行良好。 僅當代碼安裝為 package 時才會出現問題。

此代碼是由 gunicorn 控制的 flask 應用程序的一部分。 我什至嘗試使用 sudo 啟動 gunicorn,但最終得到了同樣的錯誤。

該問題是由 python 虛擬環境引起的。

我在 python 虛擬環境中安裝了具有 rabbitmqctl 命令的 package。 因此,即使該模塊具有 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中找到這些依賴命令,因為這些命令的位置不是虛擬環境路徑。 因此,請確保在上面的 rabbit_env['PATH'] 中添加所有 rabbitmqctl 相關命令的位置。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM