【发布时间】:2022-01-23 14:48:48
【问题描述】:
我正在通过类似的方式运行ansible-playbook
subprocess.run(['bash', '-c', "ansible-playbook some_playbook.yml"])
卸载并重新安装ansible-playbook 后,我的项目不知何故无法再执行它声称“bash: ansible-playbook: command not found”。
事实:
- 在 Ubuntu 20.04 上运行
-
ansible-playbook是通过pip3安装的
尝试了以下方法:
-
确保该命令可以通过终端和
python3运行并运行 -
删除了
venv文件夹并重新安装了所有东西(使用 PyCharm 会自动安装) -
通过
hash -r和hash -d ansible-playbook删除 Bash 缓存 -
重启
-
安装
pyclean并运行它 -
已删除
.idea文件夹 (PyCharm) -
将存储库重新克隆到不同的目录并重新设置所有内容。同样的问题。
-
在同一项目文件夹中创建了一个虚拟测试,发现它运行良好:
> cat test.py import subprocess process = subprocess.run(['bash', '-c', "ansible-playbook some_playbook.yml"])
在重新安装之前一切正常。在执行ansible-playbook 之前,我的程序还会运行各种 Bash 命令,我在左睾丸发誓这不是我的代码。一定有一些隐藏的神秘缓存我错过了。
感谢您的任何建议!
【问题讨论】:
-
您的 PATH 可能不包括该程序所在的目录。 (它可能在 ~/.local/bin 中。)而不是使用 bash -c,您应该使用 shell=True,或者最好使用 shutil.which() 来(尝试)定位程序。
-
@AKX 正确。它位于
~/.local/bin中,在全球重新安装后,它现在位于/usr/local/bin/ansible-playbook中。非常感谢。还要感谢shell=True的提示,但我之前对bash -c没有任何问题。无需转义,您只需将命令作为变量传递即可。但根据subprocess FAQ,这似乎是一个可靠的建议。谢谢!
标签: python python-3.x