我有一个问题与以下代码:
callBash.py:
import subprocess
print "start"
subprocess.call("sleep.sh")
print "end"
sleep.sh:
sleep 10
我希望在10秒后打印出"end"(我知道这是一个愚蠢的例子,我可以在Python中使用sleep,但这个简单的sleep.sh文件只是一个测试)。
我有一个问题与以下代码:
callBash.py:
import subprocess
print "start"
subprocess.call("sleep.sh")
print "end"
sleep.sh:
sleep 10
我希望在10秒后打印出"end"(我知道这是一个愚蠢的例子,我可以在Python中使用sleep,但这个简单的sleep.sh文件只是一个测试)。
如果 sleep.sh
文件有 #!/bin/sh
这样的shebang,并且有适当的文件权限 -- 可以运行 chmod u+rx sleep.sh
确保文件权限正确,并且该文件在 $PATH
中,那么你的代码应该可以正常工作:
import subprocess
rc = subprocess.call("sleep.sh")
如果脚本不在路径中,请指定它的完整路径,例如,如果它在当前工作目录中:
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)
import
的方法?我想在我的作业中使用你的代码,但是我们不能在 py 文件中使用 import。 - c0d3x27subprocess
模块。虽然有一些在Python中不需要显式导入就可以完成的方法,但这些都是肮脏的黑客技巧,只用于逃离沙盒环境(除非你正在学习Python安全性,否则这不太可能是你的作业)。 - jfsshell=True
,实际上可以使用#!/usr/bin/env zsh
代替,因为这是在macos上使用zsh。 - JL Peyret如果有人正在寻找如何带参数调用脚本
import subprocess
val = subprocess.check_call("./script.sh '%s'" % arg, shell=True)
在传递参数之前,记得将参数转换为字符串,使用 str(arg)。
这可以用来传递任意数量的参数:
subprocess.check_call("./script.ksh %s %s %s" % (arg1, str(arg2), arg3), shell=True)
subprocess.check_call(["./script.ksh", arg1, arg2, arg3], shell=True)
这种方式对我来说更清晰明了,而且你不需要关心格式。 - Nerxissleep.sh
具有执行权限,并使用shell=True
运行它。#!/usr/bin/python
import subprocess
print "start"
subprocess.call("./sleep.sh", shell=True)
print "end"
#!bin/bash
中的错误是缺少 /
。如我在答案中所指出的,#!/bin/bash
是有效的。 - James Waldby - jwpat7如果chmod
无效,您还可以尝试:
import os
os.system('sh script.sh')
# you can also use bash instead of sh
os.system
的文档特别建议使用subprocess
(现在是subprocess.run()
)代替它。如果你无法让subprocess
正常工作,那么很有可能你也会在使用os.system()
时遇到问题。 - tripleee因为我问如何在Python中运行bash脚本而被引导到这里,所以我添加了一个答案。如果您的脚本接受参数,则会收到错误OSError: [Errno 2] file not found
。假设您的脚本接受一个休眠时间参数: subprocess.call("sleep.sh 10")
将不起作用,您必须将其作为数组传递: subprocess.call(["sleep.sh", 10])
shell=True
的实际含义,但通常最好避免使用它。 - tripleee