Проблема при вызове командной строки из скрипта Python - PullRequest
2 голосов
/ 03 мая 2011

Мне нужна помощь в вызове командной строки (и передаче некоторого аргумента в командную строку) из сценария Python.

Я использую pyqt4 для разработки пользовательского интерфейса, и на нем у меня есть кнопка запуска. При выборе кнопки запуска я хотел бы вызвать командную строку и передать в качестве аргумента имя некоторого сценария.

self.connect(run_button, SIGNAL('clicked()'), self.runscript) # this is my run button  signal and i'm calling the runscript() 

def runscript(self):
    print 'Inside Run Script'
    os.chdir('C:\PerfLocal_PAL')
    try:
        subprocess.call(['C:\windows\system32\cmd.exe'])
    except:
        print 'Exception Caused.'

Когда я нажимаю кнопку запуска, приложение умирает и вообще не вызывает командную строку. Я пытался с os.system, а тот же результат.

Кроме того, я хотел бы знать, как передать аргумент в функцию вызова?

Любая помощь в этом направлении высоко ценится.

Спасибо

Ответы [ 4 ]

2 голосов
/ 03 мая 2011

Чтобы правильно определить пути к файлам в Python в Windows, вам необходимо выполнить одно из трех действий:

  • Использовать прямые косые черты: "C:/PerfLocal_PAL" (Python понимает прямые косые черты независимо от платформы)
  • Использовать необработанные строки: r"C:\PerfLocal_PAL"
  • Избежать обратной косой черты: "C:\\PerfLocal_PAL"

Это влияет как на ваш вызов chdir, так и на ваш вызов subprocess.call.

Однако у вас также будут проблемы из-за того, что ваш родительский процесс является приложением с графическим интерфейсом и, следовательно, не имеет консольных потоков для stdin, stdout и stderr.Вместо этого попробуйте использовать следующее, чтобы получить совершенно отдельное командное окно:

subprocess.call("start", shell=True)

Вы также можете использовать "/D" аргумент start, чтобы установить свой рабочий каталог, вместо изменения cwd командыродительский процесс:

subprocess.call(["start", "/DC:\\PerfLocal_PAL"], shell=True)
0 голосов
/ 03 мая 2011

Вы пытались отладить это вообще?На какой строке происходит сбой скрипта?Он вообще запускает функцию runscript?

Что касается передачи аргументов в cmd.exe, посмотрите документацию для subprocess.call.Он покажет вам, что у вас может быть второй аргумент, предоставляющий программе параметры командной строки, например,

subprocess.call(["C:\windows\system32\cmd.exe", "scriptname.bat"])
0 голосов
/ 03 мая 2011

Ваше сигнальное соединение и ваш вызов подпроцесса, кажется, в порядке. Измените свой вызов chdir на: </p> <pre><code> os.chdir(r'C:\PerfLocal_PAL')

Я полагаю, что ошибка, которую вы получаете, имеет вид (когда вы запускаете приложение из командной строки):

WindowsError: [Error 123] The filename, directory name, or volume label syntax is incorrect: 'C:\PerfLocal_PAL'
0 голосов
/ 03 мая 2011

Одна проблема заключается в том, что subprocess.call будет блокироваться до его завершения, и cmd.exe не вернется, пока вы не выйдете из него. Это отвечает «просто умирает», но не может объяснить, что консоль никогда не появляется. Начните с этого:

subprocess.Popen(['C:\Windows\system32\cmd.exe'])

Это, по крайней мере, не будет блокировать. Если вы можете заставить его появляться, попробуйте свои аргументы, например:

subprocess.Popen(['C:\Windows\system32\cmd.exe', 'program_or_script', 'arg1'])
...