从 python 中运行 bash 脚本

新手上路,请多包涵

我对以下代码有疑问:

调用Bash.py:

 import subprocess
print "start"
subprocess.call("sleep.sh")
print "end"

睡眠.sh:

 sleep 10

我希望在 10 秒后打印“结束”。 (我知道这是一个愚蠢的例子,我可以简单地在 python 中休眠,但是这个简单的 sleep.sh 文件只是作为一个测试)

原文由 user1638145 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 407
2 个回答

使 sleep.sh 可执行并将 shell=True 添加到参数列表(如先前答案中的建议)工作正常。根据搜索路径,您可能还需要添加 ./ 或其他一些适当的路径。 (即,将 "sleep.sh" 更改为 "./sleep.sh" 。)

shell=True 如果 bash 脚本的第一行是 shell 的路径,则不需要参数(在 Linux 等 Posix 系统下);例如, #!/bin/bash

原文由 James Waldby - jwpat7 发布,翻译遵循 CC BY-SA 3.0 许可协议

If sleep.sh has the shebang #!/bin/sh and it has appropriate file permissions – run chmod u+rx sleep.sh to make sure and it is in $PATH then your代码应该按原样工作:

 import subprocess

rc = subprocess.call("sleep.sh")

如果脚本不在 PATH 中,则指定它的完整路径,例如,如果它在当前工作目录中:

 from subprocess import call

rc = call("./sleep.sh")

如果脚本没有 shebang 那么你需要指定 shell=True

 rc = call("./sleep.sh", shell=True)

如果脚本没有可执行权限并且您无法更改它,例如,通过运行 os.chmod('sleep.sh', 0o755) 那么您可以将脚本作为文本文件读取并将字符串传递给 subprocess 模块:

 with open('sleep.sh', 'rb') as file:
    script = file.read()
rc = call(script, shell=True)

原文由 jfs 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题