2014-11-04 3 views
1

Я все еще очень новичок в Python и все еще обволакиваю все, что он может сделать. В настоящее время я работаю над небольшим приложением, чтобы помочь мне в моей работе. У этого есть графическое меню, которое позволяет мне выбирать приложения для установки на ПК. Проблема у меня есть некоторые из кнопок имеют два установщика, которые они запускают (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") 

Вот отредактированный код после того, как я сделал изменения от Steve ... также сообщение об ошибке я получаю в питона терминале после запуска программы установки (который, кажется, работает).

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 

Ошибка Msg ...

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

Спасибо за ответ. Когда я пытаюсь запустить exe с помощью subprocess.call, я получаю это: «Ошибка ОС: [WinError 740] Запрошенная операция требует отметки« Я предполагаю, что это означает, что им нужны привилегии администратора? Я администратор на своем ПК и не имею никаких проблем с их установкой. – sloppyfrenzy

+0

@sloppyfrenzy Странно. Когда я пытаюсь, установщики запускаются, как обычно, и запрашивают у пользователя повышение привилегий. Вы начинаете свой скрипт python как администратор, но это не очень элегантно. –

+0

Странно. Я запускаю Win 8.1, если это имеет значение. Когда я щелкаю правой кнопкой мыши на файле python, я не вижу запуск как параметр администратора. Является ли Subprocess лучше использовать, чем ОС в целом? – sloppyfrenzy

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"C:\Users\Erik\Desktop\install_java-7u71-x32.exe" 

вместо

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

Спасибо за ответ. Я не уверен, что этот код делает честным, по крайней мере, по отношению к проблеме, которую я испытываю. Куда бы я поместил это в свой код? Спасибо за добавление подсказки «r». – sloppyfrenzy

+0

@sloppyfrenzy Я расширил пример до функции, которую вы можете использовать, и прокомментировал ее. –

+0

Спасибо за объяснение. Я все еще не понимаю, что такое пара. Что конкретно делает «print >> sys.stderr»? Кроме того, я понял, как заставить его работать, однако я не уверен, как использовать этот код для нескольких путей к файлу. В настоящее время у меня есть путь к файлу в переменной «mycmd». Я отредактировал свой пост с обновленным кодом, который я пробовал, и с сообщением об ошибке, которое я получил в терминале python после запуска одной из установок. Установщик работает, но затем я получаю сообщение об ошибке. – sloppyfrenzy

Смежные вопросы