Python как «пакетный» скрипт (т.е. запускать команды из Python) - PullRequest
9 голосов
/ 22 ноября 2008

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

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

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

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

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

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

EDIT:

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


РЕДАКТИРОВАТЬ: это должен был быть комментарий, но когда я его опубликовал, у меня не было много очков.

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

>>> 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:\>

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

Ответы [ 4 ]

18 голосов
/ 22 ноября 2008

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

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

РЕДАКТИРОВАТЬ: я утверждаю, что вы должны предпочесть модуль Subprocess для OS. * ОС конкретных функций, он кроссплатформенный и более питонический (просто Google) Вы можете легко дождаться результата, и чисто :

import os
import subprocess
unison = os.path.join(os.path.curdir, "unison")
p = subprocess.Popen(unison)
p.wait()
6 голосов
/ 22 ноября 2008

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

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

os.system("dir")

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

4 голосов
/ 22 ноября 2008
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()

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

2 голосов
/ 22 ноября 2008

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>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...