从python启动程序而不是等待它退出

时间:2015-02-11 10:18:10

标签: python python-2.7 python-3.x

os.startfile(r"C:\Users\FZV3H2\Desktop\a.vbs")
print("hello")

**我希望执行控件在执行" a.vbs"后立即打印(" hello")开始,而不是等待" a.vbs"在下一行之前终止。 **

3 个答案:

答案 0 :(得分:0)

尝试

os.system(r"start C:\Users\FZV3H2\Desktop\a.vbs")

这会等待程序完成加载,但是当我使用它来启动excel文件时,即使excel文件仍然打开,程序也会继续执行。

或者,使用subprocess

from subprocess import Popen
Popen( [ "foo.exe", "arg1", "arg2", "arg3" )

答案 1 :(得分:0)

您应该使用subprocess库。 Popen不会等待返回代码。

from subprocess import Popen,PIPE

proc = Popen([r"C:\Users\FZV3H2\Desktop\a.vbs"])

如果要获取调用命令的结果,可以将输出重定向到stdout。

proc = Popen([r"C:\Users\FZV3H2\Desktop\a.vbs"],stdout=PIPE, stderr=PIPE)

然后使用proc.communicate()进行访问。 Popen将在大多数平台上工作,其中startfile是一个特定于Windows的命令。

答案 2 :(得分:0)

您需要来自python

的子进程模块的Popen
from subprocess import Popen
Popen([r"C:\Users\FZV3H2\Desktop\a.vbs"])

如果您希望在shell环境中执行它,请将shell=True与Popen一起使用。但是,不建议这样做

如果您的vbs文件需要设置环境和路径变量,则需要shell=True。像这样:

from subprocess import Popen
Popen(r"C:\Users\FZV3H2\Desktop\a.vbs", shell=True)

这相当于你的startfile示例。就像双击浏览器中的文件一样。两者都类似

cmd.exe /c start C:\Users\FZV3H2\Desktop\a.vbs

但是,请尽可能避免使用shell=True因为它可以引导您shell injection attacks

如果您不希望使用shell=True选项并获得WindowsError或OSError,则可以根据注册的cscript.exe或wscript.exe调用cscript.exe或wscript.exe来运行vb脚本。

In the command prompt, run these:
C:\>assoc .vbs

这将为您提供注册exe以运行vbs的名称(类似.vbs=...)。由于您到目前为止成功使用了startfile,因此这应该会给您一些价值。现在将该值传递给`ftype命令以获取绝对可执行位置。

C:\>ftype `Output of assoc goes here`

这将为您提供cscript.exe位置或wscript.exe位置。与Popen

一起使用
Popen([r".exe location here", r".vbs location here"])