2014-11-04 92 views
1

我对Python仍然很陌生,现在仍然对自己能做的所有事情都很满意。我目前正在制作一个小应用程序来帮助我工作。它有一个图形菜单,可以让我选择在PC上安装的应用程序。我遇到的问题是一些按钮有两个安装程序(32和64位)。我需要程序在开始下一个之前等待一个完成。我该怎么做呢?如何在Python中一个接一个地运行多个可执行文件

下面的代码...

def retranslateUi(self, Form): 
    Form.setWindowTitle(_translate("Form", "Form", None)) 
    self.label.setText(_translate("Form", "What would you like to install?", None)) 
    self.adobe_reader.setText(_translate("Form", "Adobe Reader", None)) 
    self.flash.setText(_translate("Form", "Flash", None)) 
    self.java_7.setText(_translate("Form", "Java 7", None)) 
    self.java_8.setText(_translate("Form", "Java 8", None)) 
    self.adobe_reader.clicked.connect(self.adobe) 
    self.flash.clicked.connect(self.flash13) 
    self.java_7.clicked.connect(self.java7) 
    self.java_8.clicked.connect(self.java8) 

def adobe(self): 
    os.startfile("C:\\Users\\Erik\\Desktop\\install_reader_11.exe") 

def flash13(self): 
    os.startfile("C:\\Users\\Erik\\Desktop\\install_flash_13_IE.exe") 
    os.startfile("C:\\Users\\Erik\\Desktop\\install_flash_13_nonIE.exe") 

def java7(self): 
    os.startfile("C:\\Users\\Erik\\Desktop\\install_java-7u71-x32.exe") 
    os.startfile("C:\\Users\\Erik\\Desktop\\install_java-7u71-x64.exe") 

def java8(self): 
    os.startfile("C:\\Users\\Erik\\Desktop\\install_java-8u25-x32.exe") 
    os.startfile("C:\\Users\\Erik\\Desktop\\install_java-8u25-x64.exe") 

下面是编辑的代码后,我从史蒂夫的变化......也是错误的消息,我得到的蟒蛇终端运行安装程序(这似乎工作岗位)。

def adobe(mycmd): 

    mycmd = r"C:\Users\Erik\Desktop\install_reader_11.exe" 

    try: 
     retcode = call(mycmd,shell = True) 
     if retcode < 0: 
      print >>sys.stderr, "Child was terminated by signal", -retcode 
     else: 
      print >>sys.stderr, "Child returned", retcode 

    except OSError as e: 
     print >>sys.stderr, "Execution failed:", e 
     retcode = -1 

    return retcode 

def flash13(mycmd): 

    mycmd = r"C:\Users\Erik\Desktop\install_flash_13_IE.exe" 

    try: 
     retcode = call(mycmd,shell = True) 
     if retcode < 0: 
      print >>sys.stderr, "Child was terminated by signal", -retcode 
     else: 
      print >>sys.stderr, "Child returned", retcode 

    except OSError as e: 
     print >>sys.stderr, "Execution failed:", e 
     retcode = -1 

    return retcode 

错误消息...

print >> sys.stderr, "Child returned", retcode 
TypeError: unsupported operand type(s) for >>: 'builtin_function_or_method' and 
'_io.TextIOWrapper' 

谢谢!

回答

3

无处不在,您正在使用os.startfile(cmd)使用subprocess.call(cmd)。在你的脚本的顶部放

import subprocess 

变更带来的具有

os.startfile("C:\\Users\\Erik\\Desktop\\whatever.exe") 

subprocess.call("C:\\Users\\Erik\\Desktop\\whatever.exe") 

使用os.startfile您的脚本的问题是,它不会阻止。这意味着您的脚本不会等待以供用户与弹出的安​​装程序交互;它只是继续前进,它可以一次弹出几个安装程序。 subprocess.call阻塞。这意味着它会等待您启动完成的任何操作,并且在安装程序关闭时脚本将立即启动。

+0

感谢您的答复。当我尝试用subprocess.call启动一个exe文件时,我得到了这个 - “操作系统错误:[WinError 740]请求的操作需要提升” 我假设这意味着他们需要管理员权限?我是我个人电脑上的管理员,通常没有问题。 – sloppyfrenzy 2014-11-04 17:37:04

+0

@sloppyfrenzy奇怪。当我尝试安装程序时,安装程​​序正常启动,要求用户提升权限。你可以以管理员身份启动你的python脚本,但这不是很优雅。 – 2014-11-04 17:44:07

+0

奇怪。我正在运行Win 8。1如果这有什么区别。当我右键单击python文件时,我没有看到以管理员身份运行的选项。子进程比一般的操作系统更好用吗? – sloppyfrenzy 2014-11-04 18:15:28

1

不是os.startfile使用类似下面的例子中,我会把它变成一个功能:

在你的代码的早期,你需要:

from subprocess import call 

def SafeExtern(mycmd): 
    """ Wrapper to call external programs checking the results """ 
    try: # This allows exceptions to be caught 
     retcode = call(mycmd, shell=True) # Call the external program 
     if retcode < 0: # Check the return code errors should be <0 
      print >>sys.stderr, "Child was terminated by signal", -retcode 
     else: 
      print >>sys.stderr, "Child returned", retcode # For information 
    except OSError as e: # Catch OSErrors and let the user know 
     print >>sys.stderr, "Execution failed:", e 
     retcode = -1 # Obviously this is an error 
    return retcode 

然后,您可以用上面的功能在每种情况下调用等待结果的外部程序。

请注意,如果每个前缀字符串R您可以摆脱双反斜线的,例如:

r"C:\Users\Erik\Desktop\install_java-7u71-x32.exe" 

而不是

"C:\\Users\\Erik\\Desktop\\install_java-7u71-x32.exe" 
+0

感谢您的回复。我不确定那些代码是否诚实,至少与我遇到的问题有关。我会在哪里把它放在我的代码中?感谢您添加“r”提示。 – sloppyfrenzy 2014-11-04 18:25:24

+0

@sloppyfrenzy我已经将示例扩展为一个可以使用和评论它的函数。 – 2014-11-04 18:33:04

+0

感谢您的解释。我仍然不清楚一些事情。 “print >> sys.stderr”具体做什么?此外,我想出了如何让它工作,但我不知道如何使用此代码的多个文件路径。目前我在“mycmd”变量中有文件路径。我使用我尝试过的更新后的代码编辑了我的帖子,并且在运行其中一个安装程序后,我在python终端中收到了错误消息。安装程序运行,但然后我得到错误。 – sloppyfrenzy 2014-11-05 18:42:40

相关问题