【问题标题】:Subprocess can't run Bash command after reinstalling binary重新安装二进制文件后子进程无法运行 Bash 命令
【发布时间】: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 -rhash -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


【解决方案1】:

让我的评论成为答案:

如果您以普通用户的身份使用最近的 pip 安装该软件包,它会将库和二进制文件安装到默认情况下不在 PATH 上的 ~/.local/bin 中。 (Pip 会警告你。)

一旦二进制文件在 PATH 上,您就可以跳过额外的 shell 进程(这是不必要的,并且在某些情况下可能会导致奇怪的事情)并且不容易受到 shell 注入攻击

import subprocess, shutil

subprocess.run([shutil.which("ansible-playbook"), "some_playbook.yml"])

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-07-25
    • 2011-06-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多