我有以下代码的问题:
callBash.py:
import subprocess
print "start"
subprocess.call("sleep.sh")
print "end"
Run Code Online (Sandbox Code Playgroud)
sleep.sh:
sleep 10
Run Code Online (Sandbox Code Playgroud)
我希望在10秒后打印"结束".(我知道这是一个愚蠢的例子,我可以简单地在python中睡觉,但这个简单的sleep.sh文件只是作为测试)
Jam*_*at7 78
使sleep.sh可执行文件并添加shell=True到参数列表(如前面的答案中所建议)可以正常工作.根据搜索路径,您可能还需要添加./或其他一些适当的路径.(即"sleep.sh"改为"./sleep.sh".)
shell=True如果bash脚本的第一行是shell的路径,则不需要该参数(在像Linux这样的Posix系统下); 例如,#!/bin/bash.
jfs*_*jfs 34
如果sleep.sh有shebang #!/bin/sh并且它具有适当的文件权限 - 运行chmod u+rx sleep.sh以确保它在那里$PATH你的代码应该按原样运行:
import subprocess
rc = subprocess.call("sleep.sh")
Run Code Online (Sandbox Code Playgroud)
如果脚本不在PATH中,则指定它的完整路径,例如,如果它在当前工作目录中:
from subprocess import call
rc = call("./sleep.sh")
Run Code Online (Sandbox Code Playgroud)
如果脚本没有shebang,那么你需要指定shell=True:
rc = call("./sleep.sh", shell=True)
Run Code Online (Sandbox Code Playgroud)
如果脚本没有可执行权限并且您无法更改它,例如,通过运行,os.chmod('sleep.sh', 0o755)您可以将脚本作为文本文件读取并将字符串传递给subprocess模块:
with open('sleep.sh', 'rb') as file:
script = file.read()
rc = call(script, shell=True)
Run Code Online (Sandbox Code Playgroud)
zen*_*poy 30
实际上,你只需添加shell=True参数:
subprocess.call("sleep.sh", shell=True)
Run Code Online (Sandbox Code Playgroud)
但要注意 -
警告如果与不受信任的输入结合使用,则使用shell = True调用系统shell可能会造成安全隐患.有关详细信息,请参阅"常用参数"下的警告.
确保sleep.sh具有执行权限,并使用以下命令运行shell=True:
#!/usr/bin/python
import subprocess
print "start"
subprocess.call("./sleep.sh", shell=True)
print "end"
Run Code Online (Sandbox Code Playgroud)
如果有人在寻找带参数的脚本
import subprocess
val = subprocess.check_call("./script.sh '%s'" % arg, shell=True)
Run Code Online (Sandbox Code Playgroud)
记得在传递之前使用str(arg)将args转换为字符串.
这可用于传递所需数量的参数
subprocess.check_call("./script.ksh %s %s %s" % (agr1, str(arg2), arg3), shell=True)
Run Code Online (Sandbox Code Playgroud)
如果chmod不起作用,那么您也可以尝试
import os
os.system('sh script.sh')
#you can also use bash instead of sh
Run Code Online (Sandbox Code Playgroud)
由我测试谢谢