2008-11-22 2 views
6

Я работаю в среде Windows (мой ноутбук!), И мне нужно несколько сценариев, которые запускают другие программы, в значительной степени похожие на пакетный файл Windows.python как «пакетный» скрипт (т. Е. Запуск команд из python)

Как я могу запустить команду из python, чтобы программа при запуске заменила скрипт? Программа интерактивна (например, унисон) и продолжает печатать строки и постоянно спрашивать пользователя.

Итак, просто запустить программу и распечатать вывод не хватит. Программа должна захватить ввод/вывод сценария, довольно mcuh, как запуск команды из .bat-файла.

Я пробовал os.execl, но он продолжает говорить мне «недопустимые аргументы», также он не находит имя программы (не ищет переменную PATH); Я должен дать ему полный путь ..?!

в основном, в пакетном сценарии я могу написать: унисон профиль

как я могу добиться того же эффекта в Python?

EDIT:

я узнал, что это может быть сделано с os.system(...) и так как я не могу принять свой ответ, я закрываю вопрос.


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

Спасибо Клаудиу, это в значительной степени то, что я хочу, за исключением маленькой вещи: я хочу, чтобы функция заканчивалась, когда программа выходит, но когда я пытаюсь ее унисон, она не возвращает управление скрипту python, но к среде командной строки окон

>>> os.execlp("unison") 

C:\>Usage: unison [options] 
    or unison root1 root2 [options] 
    or unison profilename [options] 

For a list of options, type "unison -help". 
For a tutorial on basic usage, type "unison -doc tutorial". 
For other documentation, type "unison -doc topics". 

C:\> 
C:\> 
C:\> 

Как обойти это?

+0

Это помогает обеспечить скрипт, который не работает. – 2008-11-22 23:53:36

+0

Не нужно закрывать вопрос, потому что вы не можете принять свой ответ. Если это самый признанный голос, это в основном то же самое, что и принятое. Немного раздражает, правда, но закрытие - это не правильный путь вокруг, я бы сказал. – dbr 2008-12-27 03:11:37

ответ

6

я узнал, что os.system делает то, что я хочу,

Спасибо за все, что пытались помочь.

os.system("dir") 

запускает команду так же, как если бы он был запущен из пакетного файла

17

Вы должны создать новую процессию, используя subprocess module.

Я не владею процессами Windows, но его функция Popen является кросс-платформенной и должна использоваться для конкретных решений ОС.

EDIT: Я утверждаю, что вы должны предпочесть модуль Subprocess для os. * Особые функции ОС, это кросс-платформенные и более питонические (просто Google). Вы можете ждать результата легко и чисто:

import os 
import subprocess 
unison = os.path.join(os.path.curdir, "unison") 
p = subprocess.Popen(unison) 
p.wait() 
+0

Неразумный нижний уровень. +1 – 2008-11-22 19:01:55

+0

Извините, моя вина. Я был уверен, что подпроцесс не будет подключать STDIN/STDOUT при использовании этого. По-видимому, уже слишком поздно отменять мой голос. – 2008-11-22 23:15:46

2

os.execlp должен работать. Это приведет к поиску вашего пути к команде. Не давать ему какие-либо аргументы, если они не необходимы:

>>> import os 
>>> os.execlp("cmd") 

D:\Documents and Settings\Claudiu>Microsoft Windows XP [Version 5.1.2600] 
(C) Copyright 1985-2001 Microsoft Corp. 

D:\Documents and Settings\Claudiu> 
4
import subprocess 

proc = subprocess.Popen(['unison', 'profile'], stderr=subprocess.PIPE,  
         stdout=subprocess.PIPE, stdin=subprocess.PIPE) 

proc.stdin.write('user input') 
print proc.stdout.read() 

Это должно помочь вам начать работу. Пожалуйста, отредактируйте свой вопрос с дополнительной информацией, если вы хотите получить более подробный ответ!

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

  • Нет связанных вопросов^_^